【发布时间】:2015-12-12 15:07:02
【问题描述】:
对于我当前的 Django 项目,我构建了一个使用 3 个 ModelForms 的页面。
整个页面应该让酒店在网站上注册。 所以第一个 ModelForm 来自 Hotel 模型
接下来我希望用户为图像输入 2 个表单,一个主图像和一个背景图像。这 2 个模型继承自一个基本的 Image 类。
所以在这种情况下,两个图像都将使用来自基类的标题字段。
现在,当我在表单中输入新酒店并添加 2 张图片时,两张图片的标题相同。
当我查看 html 代码时,这是有道理的,因为输入字段都具有相同的 name="title"。
对于其余部分,表单按预期工作,这只是一个问题。
当然,我可以只取标题字段并将它们作为 child_class_1_title 和 child_class_2_title 放入子类中,但这只会破坏整个 OOP 和 DRY 原则。
如何确保每个表单都将正确的数据推送到数据库中? 提前非常感谢。
这是我的表单代码:
class HotelForm(ModelForm):
class Meta:
model = Hotel
fields = ('name', 'address', 'zip_code', 'city', 'website', 'email', 'phone', 'description', 'short_description', 'number_of_rooms', 'facilities',
'activities', 'environment', 'hotel_type')
widgets = {
'facilities': CheckboxSelectMultiple()
}
class HotelGeneralImageForm(ModelForm):
class Meta:
model = HotelGeneralImage
fields = ('title', 'hotel_general_image')
widgets = {
'hotel_general_image': FileWidget()
}
class HotelBackgroundImageForm(ModelForm):
class Meta:
model = HotelBackgroundImage
fields = ('title', 'hotel_background_image')
widgets = {
'hotel_background_image': FileWidget()
}
还有观点:
@csrf_exempt
def hotel_registration(request):
if request.method == 'POST':
hotel_form = HotelForm(request.POST, instance=Hotel())
hotel_general_image_form = HotelGeneralImageForm(request.POST, instance=HotelGeneralImage())
hotel_background_image_form = HotelBackgroundImageForm(request.POST, instance=HotelBackgroundImage())
if hotel_form.is_valid() and hotel_general_image_form.is_valid() and hotel_background_image_form.is_valid():
new_hotel = hotel_form.save()
new_hotel_general_image = hotel_general_image_form.save(commit=False)
new_hotel_general_image.hotel = new_hotel
new_hotel_general_image.save()
new_hotel_background_image = hotel_background_image_form.save(commit=False)
new_hotel_background_image.hotel = new_hotel
new_hotel_background_image.save()
return HttpResponseRedirect('registered')
else:
hotel_form = HotelForm(instance=Hotel())
hotel_general_image_form = HotelGeneralImageForm(instance=HotelGeneralImage())
hotel_background_image_form = HotelBackgroundImageForm(instance=HotelBackgroundImage())
context = {'hotel_form': hotel_form,
'hotel_general_image_form': hotel_general_image_form,
'hotel_background_image_form': hotel_background_image_form
}
context.update(csrf(request))
return render_to_response('hotel/hotel-registration-form.html', context)
【问题讨论】: