How to add an GenericRelation field in a form in Django

2.3k views Asked by At

I have this following error:

django.core.exceptions.FieldError: 'pictures' cannot be specified for Building model form as it is a non-editable field

I many models that can have many Images. So I used django's GenericRelation. But as soon as I added the 'pictures' field in forms.py. I get an error

forms.py

class BuildingForm(ModelForm):
    class Meta:
        model = Building
        fields = ['landlord', 'address', 'pictures']

models.py

from stdimage.models import StdImageField

class Image(TimeStampedModel, models.Model):
    picture = StdImageField(upload_to='pictures/%Y/%m/%d',
                            verbose_name="pics", null = True, blank = True, variations={
        'large': (600, 400),
        'thumbnail': (250, 250, True),
        'medium': (300, 200),
    }, default='default.jpg')
    # Generic Foreign Key
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey()


class Building(TimeStampedModel, models.Model):
    landlord = models.ForeignKey(
                settings.AUTH_USER_MODEL,
                related_name='building_manager')
    address = models.CharField(max_length=50, blank=False)
    pictures = GenericRelation(Image, null = True, blank = True,
        related_query_name='dwelling_picture', verbose_name=_('Screenshots'))

views.py

class BuildingCreateView(SuccessMessageMixin, CreateView):
    form_class = BuildingForm
    template_name = "parking/building/building_form.html"
    success_message = 'Successfully Added a Post entry'
    success_url = reverse_lazy('parkers:building_list')

    def form_valid(self, form):
        self.object = form.save(commit=True)
        #self.object.author = self.request.user
        return super(BuildingCreateView, self).form_valid(form)

parking_building_new = login_required(BuildingCreateView.as_view())

forms.html

<div class="container">
    <div class="row">
        <div class="col-lg-10 col-lg-1-offset">
            <form action="." method="post" enctype="multipart/form-data">
                {% csrf_token %}
                {{ form.as_p }}
                <input type="submit" value="Submit" />
            </form>

        </div>
    </div>
</div>

trace

 File "/home/laptopvm/Documents/Github/django_project_tutorial_genericrelation_key/parking/urls.py", line 4, in <module>
    from parking.views import user_profile_views
  File "/home/laptopvm/Documents/Github/django_project_tutorial_genericrelation_key/parking/views/user_profile_views.py", line 26, in <module>
    from parking.forms  import UserProfileForm
  File "/home/laptopvm/Documents/Github/django_project_tutorial_genericrelation_key/parking/forms.py", line 7, in <module>
    class BuildingForm(ModelForm):
  File "/home/laptopvm/anaconda3/lib/python3.6/site-packages/django/forms/models.py", line 266, in __new__
    apply_limit_choices_to=False,
  File "/home/laptopvm/anaconda3/lib/python3.6/site-packages/django/forms/models.py", line 159, in fields_for_model
    f.name, model.__name__)
django.core.exceptions.FieldError: 'pictures' cannot be specified for Building model form as it is a non-editable field
1

There are 1 answers

0
Paul Jurczyk On BEST ANSWER

GenericForeignKeys aren't meant to be used with ModelForms. They're not editable on purpose. You also can't use filter() on them or exclude(). You can reference the docs for more info:

https://docs.djangoproject.com/en/2.1/ref/contrib/contenttypes/#generic-relations