Python 德扬戈。获取CreateView中ForeignKey对象的id

Python 德扬戈。获取CreateView中ForeignKey对象的id,python,django,django-class-based-views,create-view,class-based-views,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.ForeignK

我在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'
我的模型形式如下所示:

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')
还有我的URL.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')
url(r'^dev/flat/(?P[0-9]+)/$),视图\u dev.flat\u ajax,name='flatdetail'),
url(r“^dev/photo update/$”,视图\u dev.PhotoUploadView.as\u view(),name='image-update')
我理解错误,但没有足够的技能来处理它。self.object.pk应该是图片的id,而不是公寓的id,对吗?
我可以得到公寓的id吗?

你误解了错误,但部分原因是你所做的没有多大意义

self.object
只能引用此视图所涉及的对象,在本例中,该对象就是照片;但当然,当你做
get_initial
时,那张照片还不存在,因为它还没有被创建。似乎要使用特定平面对象的ID;在这种情况下,您需要将该ID传递给视图,即通过URL。您已经在
flat\u ajax
视图中完成了这项工作;您应该在这里执行完全相同的操作,然后您将能够通过
self.kwargs['flat\u ID']
引用ID

请注意,无论如何,
get_initial
并不是这样做的最佳场所。用户和平面对象不是要传递给表单的值,以便它们最初填充字段,而是让用户更改它们;它们是要在保存时自动与对象关联的值。因此,这实际上应该以
形式执行,如所示:


如果您这样做,您应该从表单中列出的字段中删除
photo\u user
photo\u flat

您误解了错误,但部分原因是您所做的没有多大意义

self.object
只能引用此视图所涉及的对象,在本例中,该对象就是照片;但当然,当你做
get_initial
时,那张照片还不存在,因为它还没有被创建。似乎要使用特定平面对象的ID;在这种情况下,您需要将该ID传递给视图,即通过URL。您已经在
flat\u ajax
视图中完成了这项工作;您应该在这里执行完全相同的操作,然后您将能够通过
self.kwargs['flat\u ID']
引用ID

请注意,无论如何,
get_initial
并不是这样做的最佳场所。用户和平面对象不是要传递给表单的值,以便它们最初填充字段,而是让用户更改它们;它们是要在保存时自动与对象关联的值。因此,这实际上应该以
形式执行,如所示:


如果这样做,您应该从表单中列出的字段中删除
photo\u user
photo\u flat

@Pythonista,我认为我试图做一些愚蠢的事情,如果我想将flat.id传递给
photo\u flat
也许我应该在
def get\u initial(self)中包含
flat=get\u object\u或
?但它会返回我所有的公寓列表。我怎样才能通过某些身份证?像这样:
flat=get\u object\u或\u 404(flat,pk=flat\u id)
?但是它不起作用,因为
get\u initial
没有
flat\u id
@Pythonista,我想我会尝试做一些愚蠢的事情,如果我想将flat.id传递到
photo\u flat
也许我应该在
def get\u initial(self)
中包含
flat=get\u object\u或_404(flat)
?但它会返回我所有的公寓列表。我怎样才能通过某些身份证?像这样:
flat=get\u object\u或\u 404(flat,pk=flat\u id)
?但是它不起作用,因为
get\u initial
没有
flat\u id
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)