我在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'
我的CreateView:
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而不是公寓? 我可以获得公寓的身份吗?
答案 0 :(得分:3)
你误解了错误,但这部分是因为你所做的事情没有多大意义。
self.object
只能引用此视图所关注的对象,在本例中为Photo;但是当你执行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
。