姜戈。在 CreateView 中获取 ForeignKey 对象的 ID
Django. Get id of ForeignKey object in CreateView
我研究了django中的CBV。
我希望用户可以将图像上传到公寓的某个卡片。
所以创建了模型:
class Photo(models.Model):
photo_path = models.ImageField(verbose_name='Фотография')
photo_user = models.ForeignKey(User, verbose_name='Агент, добавивший фото')
photo_flat = models.ForeignKey(Flat, verbose_name='Квартира')
photo_description = models.CharField(verbose_name='Описание', max_length=200, null=True, blank=True)
表格的初始数据是photo_user和photo_flat。
当我尝试通过页面上的表单保存一张或多张图片时,我得到了 AttributeError
。
'NoneType' object has no attribute 'pk'
我的 ModelForm 如下所示:
class PhotoUploadModelForm(forms.ModelForm):
class Meta:
model = Photo
fields = ['photo_path','photo_user','photo_flat','photo_description'
我的创建视图:
class PhotoUploadView(CreateView):
form_class = PhotoUploadModelForm
def get_initial(self):
return {'photo_user': self.request.user,
'photo_flat': self.object.pk
}
def get_success_url(self):
return reverse('ha:flatdetail')
和我的urls.py
url(r'^dev/flat/(?P<flat_id>[0-9]+)/$', views_dev.flat_ajax, name='flatdetail'),
url(r'^dev/photo-update/$', views_dev.PhotoUploadView.as_view(), name='image-update')
我理解错误,但没有足够的技能来处理它。 self.object.pk 是图片的 ID 而不是公寓的 ID,我说得对吗?
我可以得到公寓的编号吗?
你误解了错误,部分原因是你所做的事情没有多大意义。
self.object
只能引用此视图所关注的对象,在本例中是照片;但是当您 get_initial
时,那张照片当然还不存在,因为它还没有被创建。看起来你想使用特定 Flat 对象的 ID;在这种情况下,您需要将该 ID 传递给视图,即通过 URL。您已经在 flat_ajax
视图中执行此操作;你应该在这里做完全相同的事情,然后你就可以通过 self.kwargs['flat_id']
.
引用 ID
请注意,无论如何,get_initial
并不是执行此操作的最佳位置。 User 和 Flat 对象不是您想要传递给表单的值,因此它们最初填充字段但让用户更改它们;它们是您希望在保存时自动与对象关联的值。所以,这真的应该在 form_valid
中完成,如 the documentation:
所示
def form_valid(self, form):
form.instance.photo_user = self.request.user
form.instance.photo_flat_id = self.kwargs['flat_id']
return super(PhotoUploadView, self).form_valid(form)
如果您这样做,您应该从表单中列出的字段中删除 photo_user
和 photo_flat
。
我研究了django中的CBV。 我希望用户可以将图像上传到公寓的某个卡片。 所以创建了模型:
class Photo(models.Model):
photo_path = models.ImageField(verbose_name='Фотография')
photo_user = models.ForeignKey(User, verbose_name='Агент, добавивший фото')
photo_flat = models.ForeignKey(Flat, verbose_name='Квартира')
photo_description = models.CharField(verbose_name='Описание', max_length=200, null=True, blank=True)
表格的初始数据是photo_user和photo_flat。
当我尝试通过页面上的表单保存一张或多张图片时,我得到了 AttributeError
。
'NoneType' object has no attribute 'pk'
我的 ModelForm 如下所示:
class PhotoUploadModelForm(forms.ModelForm):
class Meta:
model = Photo
fields = ['photo_path','photo_user','photo_flat','photo_description'
我的创建视图:
class PhotoUploadView(CreateView):
form_class = PhotoUploadModelForm
def get_initial(self):
return {'photo_user': self.request.user,
'photo_flat': self.object.pk
}
def get_success_url(self):
return reverse('ha:flatdetail')
和我的urls.py
url(r'^dev/flat/(?P<flat_id>[0-9]+)/$', views_dev.flat_ajax, name='flatdetail'),
url(r'^dev/photo-update/$', views_dev.PhotoUploadView.as_view(), name='image-update')
我理解错误,但没有足够的技能来处理它。 self.object.pk 是图片的 ID 而不是公寓的 ID,我说得对吗? 我可以得到公寓的编号吗?
你误解了错误,部分原因是你所做的事情没有多大意义。
self.object
只能引用此视图所关注的对象,在本例中是照片;但是当您 get_initial
时,那张照片当然还不存在,因为它还没有被创建。看起来你想使用特定 Flat 对象的 ID;在这种情况下,您需要将该 ID 传递给视图,即通过 URL。您已经在 flat_ajax
视图中执行此操作;你应该在这里做完全相同的事情,然后你就可以通过 self.kwargs['flat_id']
.
请注意,无论如何,get_initial
并不是执行此操作的最佳位置。 User 和 Flat 对象不是您想要传递给表单的值,因此它们最初填充字段但让用户更改它们;它们是您希望在保存时自动与对象关联的值。所以,这真的应该在 form_valid
中完成,如 the documentation:
def form_valid(self, form):
form.instance.photo_user = self.request.user
form.instance.photo_flat_id = self.kwargs['flat_id']
return super(PhotoUploadView, self).form_valid(form)
如果您这样做,您应该从表单中列出的字段中删除 photo_user
和 photo_flat
。