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
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