0

我在 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?我可以得到公寓的id吗?

4

1 回答 1

4

您误解了错误,但这部分是因为您所做的事情没有多大意义。

self.object只能引用该视图所关注的对象,在本例中为照片;但是当你这样做的时候,那张照片当然还不存在get_initial,因为它还没有被创建。看来您想使用特定 Flat 对象的 ID;在这种情况下,您需要将该 ID 传递给视图,即通过 URL。在您flat_ajax看来,您已经这样做了;你应该在这里做同样的事情,然后你就可以通过self.kwargs['flat_id'].

请注意get_initial,无论如何,这并不是执行此操作的最佳位置。User 和 Flat 对象不是您要传递给表单的值,以便它们最初填充字段但让用户更改它们;它们是您希望在保存时自动与对象关联的值。所以,这真的应该在 中完成form_valid,如文档中所示:

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

于 2016-05-21T19:22:58.957 回答