【发布时间】:2016-09-18 23:07:35
【问题描述】:
我正在研究 Django 中的 CBV。
我有一个Flat 的页面。我希望用户能够在该页面上添加公寓的一些图片。
公寓的照片存储在模型中,并与User和Flat模型连接。我的模型如下所示:
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)
我的目标:如果用户添加一些图片并按下按钮,图片将被保存到模型中。然后,用户将被重定向到公寓的同一详细视图,并会看到他们添加的图片。
我尝试了不同的选项,但我没有足够的技能来处理这个问题。
首先让我感到困惑的是CreateView 中的template_name 变量。我的 CreateView 看起来像这样:
class PhotoUploadView(CreateView):
form_class = PhotoUploadModelForm
template_name = 'photo_upload.html'
def form_valid(self, form):
self.instance.photo_user = self.request.user
self.instance.photo_flat_id = self.kwargs['flat_id']
form.save()
return super(PhotoUploadView, self).form_valid(form)
def get_success_url(self):
return reverse('flatdetail')
如果我不想向用户显示任何不同的页面怎么办?我希望在发布图片后将它们重定向到相同的平面细节视图。由于以下错误,我无法从CreateView 中删除template_name:
TemplateResponseMixin requires either a definition of 'template_name' or an implementation of 'get_template_names()'
我在上面的CreateView 中取得了什么成就?
第二个令人困惑的事情:我发布了图片并被重定向到redirect.html,但不是平面细节视图。那很糟。但是我的照片也没有保存。这很糟糕。我尝试将redirect.html 更改为flatdetail.html,但当然,它显示的页面没有其他信息,例如房间、大小、价格等。
在这种特殊情况下我应该怎么做才能实现两件事:
保存数据
在添加一些照片后将用户重定向到平面细节视图。
附加信息:
我的urls.py
url(r'^dev/flat/(?P<flat_id>[0-9]+)/$', views_dev.flat_ajax, name='flatdetail'),
url(r'^dev/photo-update/(?P<flat_id>[0-9]+)/$', views_dev.PhotoUploadView.as_view(), name='image-update')
我的forms.py
class PhotoUploadModelForm(forms.ModelForm):
class Meta:
model = Photo
fields = ['photo_path']
我在 flatdetail 模板中的表单:
<form action="/dev/photo-update/{{flat.id}}/" method="POST">
{% csrf_token%}
<input type="file" multiple>
<button>Send</button>
</form>
【问题讨论】:
-
由于您使用了我对上一个问题的回答中的代码,因此您应该接受该回答。
-
您成功了吗,或者您需要更多帮助?如果我的回答是“答案”,你介意接受吗?
标签: python django django-forms django-class-based-views