我有2个型号
游览以保存游览
TourImage保存与Tour相关的图像
class Tour(models.Model):
name = models.CharField(max_length=50)
class TourImage(models.Model):
tour = models.ForeignKey(Tour, on_delete=models.CASCADE)
image = models.FileField(upload_to='images/')
在我的views.py文件中,我具有以下代码来保存游览和游览图像
class CreateTourView(CreateView):
model = Tour
template_name = "create_tour.html"
fields = "__all__"
def form_valid(self, form):
tour = form.save()
for image in self.request.FILES.getlist("extra_images"):
TourImage.objects.create(tour=tour, image=image)
return super().form_valid(form)
HTML表单如下所示
<form action="" method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form | crispy }}
<input type="file" name="extra_images" multiple />
<input type="submit" value="Save" />
</form>
效果很好,图像保存在数据库中。
但我也想添加选项来编辑Tour并添加额外的图像,因此UpdateView代码如下
class TourUpdateView(UpdateView):
model = Tour
template_name = "update_tour.html"
fields = "__all__"
def form_valid(self, form):
tour = form.save()
for image in self.request.FILES.getlist("extra_images"):
TourImage.objects.create(tour=tour, image=image)
return super().form_valid(form)
.form_valid()
CreateView和UpdateView的方法相同。
有没有更好的方法编写此代码,以避免重复代码?
您创建一个mixin:
class TourImageMixin:
model = Tour
def form_valid(self, form):
tour = form.save()
for image in self.request.FILES.getlist('extra_images'):
TourImage.objects.create(tour=tour, image=image)
return super().form_valid(form)
然后将其混合在两个视图中:
class CreateTourView(TourImageMixin, CreateView):
template_name = 'create_tour.html'
fields = '__all__'
class TourUpdateView(TourImageMixin, UpdateView):
template_name = "update_tour.html"
fields = '__all__'
实际上,Django的视图(例如ListView
[classic CBV])是使用定义某些行为的mixin构建的。对于ListView
在MultipleObjectTemplateResponseMixin
[Django的DOC],TemplateResponseMixin
[Django的DOC]和MultipleObjectMixin
[Django的DOC]被使用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句