Django 基于下拉字段呈现不同的ModelForm

Django 基于下拉字段呈现不同的ModelForm,django,django-models,django-forms,django-templates,Django,Django Models,Django Forms,Django Templates,我有几个不同的个人资料,我希望人们能够创建(让我们称他们为特殊类型的苹果)。我正在渲染基本苹果表单,其中包含苹果、红苹果或绿苹果类型的下拉列表。基于此下拉列表,我还希望显示基于概要文件的RedAppleProfileForm或GreenAppleProfileForm模型表单 如何有条件地呈现这些表单 我已尝试使用display:none呈现这两个表单,并根据选定的元素值更改显示,但由于呈现表单的字段是必需的,因此即使表单具有display:none,我也无法提交。如果有办法解决这个问题,这就

我有几个不同的个人资料,我希望人们能够创建(让我们称他们为特殊类型的苹果)。我正在渲染基本苹果表单,其中包含苹果、红苹果或绿苹果类型的下拉列表。基于此下拉列表,我还希望显示基于概要文件的RedAppleProfileForm或GreenAppleProfileForm模型表单

如何有条件地呈现这些表单

  • 我已尝试使用
    display:none
    呈现这两个表单,并根据选定的元素值更改显示,但由于呈现表单的字段是必需的,因此即使表单具有
    display:none
    ,我也无法提交。如果有办法解决这个问题,这就是一个解决方案
相关堆栈:

这个堆栈上的注释:4个向上投票的解决方案似乎适用于2个配置文件,例如红苹果和绿苹果,但在我的场景中,我碰巧有5种不同类型的苹果,我不知道如何使它工作。被接受的解决方案可能会奏效,但我不完全明白怎么做?我是否只需要一个基本表单就可以继承我所有的5个ProfileForms


Python3.8、Django 3.0我认为最好的方法是将表单分为两种形式:按钮本身作为表单(用于区分要呈现的表单)和“实际”苹果表单作为第二种表单。只要你能找到一种方法来对齐样式,我认为这样做没有任何问题。实施:


views.py

如果request.POST中的'red_apple':
#返回正确的表单
其他:
#返回另一张表格
请注意,您可能希望选择其中一个作为默认值,否则,只有choice按钮而没有表单看起来会很奇怪


编辑:我最终修改了我的代码,使用了抽象继承,效果更好。我建议在尝试使用配置文件之前先研究一下这一点。使用抽象继承,您可以更轻松地坚持使用诸如UpdateView/CreateView之类的东西

他妈的明白了。如果您不需要将下拉列表作为模型的一部分,请使用crimsonpython24的答案。如果你这样做了,诀窍就是用onchange下拉列表发回你的视图

class AppleForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields["color"].widget.attrs.update({"onchange": "this.form.submit()"})

    class Meta:
        ...
现在,当用户选择他们想要的典当(或苹果)类型时,它会发布

以下是我的看法:

class AppleCreate(LoginRequiredMixin, View):
    login_url = "/login/"

    @staticmethod
    def _create_apple(pawn_form, profile_form):
        apple = apple_form.save()
        profile_obj = profile_form.save(commit=False)
        profile_obj.apple = apple
        profile_obj.save()      
        return redirect(reverse("list_apples"))

    def get(self, request):
        context = {"apple_form": AppleForm()}
        return render(request, "my/template.html", context=context)

    def post(self, request):
        apple_form = AppleForm(request.POST)

        apple_color = request.POST.get("color", "")
        profile_form_selector = {"Red": RedAppleProfileForm(request.POST), "Green": GreenAppleProfileForm(request.POST)}
        profile_form = profile_form_selector.get(apple_color, "")

        if apple_color and apple_form.is_valid() and profile_form.is_valid():
            return AppleCreate._create_apple(apple_form, profile_form)
        else:
            return render(request, "my/template.html", context={"apple_form": pawn_form, "profile_form": profile_form})

基本上,在post方法中,如果您拥有所有数据,就可以完成。如果不需要,则需要在表单中重新输入所有要显示的字段。

Hmm我喜欢这样做。我会试一试,回来再发表评论!谢谢你。。10小时后的工作。。。最后所有的东西都变成了一种形式,因为我把苹果的类型作为基本模型的一部分。如果有一种很好的方法可以在不知道其类型的情况下访问该配置文件,那么我绝对会选择这条路线。。但我想我需要做一些愚蠢的尝试来找出相关的名字。。我不能让所有相关的名字都一样,所以我最终只需要一张表格就可以了