Django的。在CreateView中获取ForeignKey对象的id

时间:2016-05-21 17:57:43

标签: python django django-class-based-views create-view class-based-views

我在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而不是公寓? 我可以获得公寓的身份吗?

1 个答案:

答案 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_userphoto_flat