Python 德扬戈。获取CreateView中ForeignKey对象的id
我在django研究CBV。 我想一个用户可以上传图像到一个公寓的特定卡。 因此,创建了该模型: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
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)