【问题标题】:Django multiple forms on one page with inherited modelsDjango 在一个页面上使用继承模型的多个表单
【发布时间】: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)

【问题讨论】:

    标签: python django forms


    【解决方案1】:

    表单前缀将解决您的问题:

    hotel_general_image_form = HotelGeneralImageForm(prefix='general', ...)
    hotel_background_image_form = HotelBackgroundImageForm(prefix='background', ...)
    

    这样每个表单都有自己的前缀,因此不会干扰其他表单。

    更多文档 - https://docs.djangoproject.com/en/1.9/ref/forms/api/#django.forms.Form.prefix

    【讨论】:

      猜你喜欢
      • 2011-08-16
      • 1970-01-01
      • 1970-01-01
      • 2020-03-16
      • 2021-06-18
      • 1970-01-01
      • 2012-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多