Django 有没有更好的方法来编写这样的代码,以便保持干燥?
我有两种型号Django 有没有更好的方法来编写这样的代码,以便保持干燥?,django,django-forms,django-class-based-views,django-file-upload,Django,Django Forms,Django Class Based Views,Django File Upload,我有两种型号 拯救旅游 TourImage可保存与巡更相关的图像 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/') 在m
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/')
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>
CreateView和UpdateView的.form\u valid()
方法都是相同的
是否有更好的方法对此进行编码以避免重复编码?您可以创建一个mixin:
class-mixin:
模型=旅游
def表单_有效(自身、表单):
tour=form.save()
对于self.request.FILES.getlist(“额外图像”)中的图像:
TourImage.objects.create(tour=tour,image=image)
return super().form\u有效(form)
然后将其混合到两个视图中:
class CreateTourView(TourImageMixin, CreateView):
template_name = 'create_tour.html'
fields = '__all__'
class TourUpdateView(TourImageMixin, UpdateView):
template_name = "update_tour.html"
fields = '__all__'
类CreateTourView(TourImageMixin,CreateView):
模板名称='create\u tour.html'
字段='\uuuu所有\uuuu'
类TourUpdateView(TourImageMixin,UpdateView):
template\u name=“update\u tour.html”
字段='\uuuu all\uuuu'
事实上,Django的视图(例如)是用定义特定行为的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__'