【问题标题】:Passing default values into an unbound django form将默认值传递给未绑定的 django 表单
【发布时间】:2022-01-07 12:52:35
【问题描述】:

我有两个选择类,我试图以未绑定的形式创建。数据选择只与在视图中创建的表示相关,因此是一次性的,不需要保存在模型中。

我面临的挑战是我可以传入字段列表,但如何设置“默认”选中/选定值以使表单变为“绑定”?

views.py

def cards(request):

sort_name = []
    sort_name.append("Alphabetic Order")
    sort_name.append("Most Popular")
    sort_name.append("Least Popular")
    sort_name.append("Highest Win Rate")
    sort_name.append("Lowest Win Rate")

    sort_id = range(len(sort_name))
    sort_list = list(zip(sort_id, sort_name))    

    <more code to make filt_list and zip it>

    if request.method == 'POST':
        form = cardStatsForm(request.POST, sortList=sort_list, filtList=filt_list)
        if form.is_valid():
           do something
        else:
           do something else

   else:
        form = cardStatsForm(filter_list, sort_list)

forms.py

class cardStatsForm(forms.Form):
    def __init__(self, filterList, sortList, *args, **kwargs):
        super(cardStatsForm, self).__init__(*args, **kwargs)
        self.fields['filts'].choices = filterList
        self.fields['filts'].label = "Select player rankings for inclusion in statistics:"
        self.fields['sorts'].choices = sortList
        self.fields['sorts'].label = "Choose a sort order:"

    filts = forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple, choices=(), required=True)
    sorts = forms.ChoiceField(choices=(), required=True)

我遇到的困难是表单未通过“is_valid”测试,因为它没有绑定,并且我有“required=true”设置(因此用户必须选择一个复选框/选择一个值),但是我无法强制执行逻辑,因为表单似乎永远不会“绑定”。

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

    您可以使用 django forms validation 或在您的 views.py 中传递默认值。如果值与您的默认值不匹配,它将返回未绑定的表单。

    让您在 views.py 中向您展示如何做到这一点:

    error_message = None 
    default_value = "jhone" 
    if form.is_valid():
               name = request.POST['name']
               defult_name = jhone
               if defult_name != name:
                  error_message = 'Name must be jhone'
               if not error_message:
                     form.save()  #it will only save forms if default value match                       
               
               
            else:
               do something else
    context = {'error_message':error_message,
               'default_value': default_value, 
                'form':form,  
               } #pass the context in your html template for showing default value and error message 
    

    在您的 .html

        {{error_message}}
       <input type=text name='name' {%if form.is_bound %} value="{{default_value}} {%endif%}">
    

    【讨论】:

    • 感谢您抽出宝贵时间查看我的问题。我尚未验证您的答案,因为我能够在我的表单类语句中使用 initial = 0 值来解决它。
    【解决方案2】:

    我能够通过添加“initial=0”并修改我的表单调用来纠正我的问题,如下所述:

    forms.py

    filts = forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple, choices=(), initial=0, required=True)
    sorts = forms.ChoiceField(choices=(), initial=0, required=True)
    

    views.py

        if request.method == 'POST':
            form = cardStatsForm(data=request.POST, sortList=sort_list, filterList=filter_list)
        else:
            form = cardStatsForm(filter_list, sort_list)
    

    【讨论】:

      猜你喜欢
      • 2013-04-08
      • 1970-01-01
      • 1970-01-01
      • 2019-09-06
      • 2016-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-20
      相关资源
      最近更新 更多