簡體   English   中英

以Django形式多次重復單個字段

[英]Repeating a single field multiple times in a django form

警告: 我知道字段集,但仍然不相信它們對於這樣一個簡單的想法是必需的。

我有一個簡單的表創建表單,該表單從給定的數據集中允許用戶提取某些列:

class TableBuildingForm(forms.Form):
    data_set = forms.ChoiceField(choices=DATASETS,required=True,label="Initial object")
    col1 = forms.CharField(label='Column 1', max_length=100, required=False)
    col2 = forms.CharField(label='Column 2', max_length=100, required=False)
    col3 = forms.CharField(label='Column 3', max_length=100, required=False)
    col4 = forms.CharField(label='Column 4', max_length=100, required=False)
    col5 = forms.CharField(label='Column 5', max_length=100, required=False)
    sort_by = forms.CharField(label='Sort by', max_length=100, required=False)

然后在處理視圖時,我要做的是:

def custom_table(request):
    # if this is a POST request we need to process the form data
    rows = []
    columns = []

    if request.method == 'POST':
      form = forms.TableBuildingForm(request.POST)
      if form.is_valid():
        sort_by = form.cleaned_data['sort_by']
        columns = [ col for col in [
                    form.cleaned_data['col1'],
                    form.cleaned_data['col2'],
                    ... etc ...
                  ]

忽略動態表單的前端方面(這並不困難),直接的問題是,如果用戶想要多於 5列,例如6、9或42。

好吧,我所看到的每個答案都建議使用模板集。 但是對於這種用例,這意味着只用一個字段col1創建表單,這似乎過於復雜。

我想要的是這樣的:

class TableBuildingForm(forms.Form):
    data_set = forms.ChoiceField(choices=DATASETS,required=True,label="Initial object")
    columns = forms.CharField(label='Column 1', max_length=100, required=False)
    sort_by = forms.CharField(label='Sort by', max_length=100, required=False)

與之對應:

def custom_table(request):
    # if this is a POST request we need to process the form data
    rows = []
    columns = []

    if request.method == 'POST':
      form = forms.TableBuildingForm(request.POST)
      if form.is_valid():
        sort_by = form.cleaned_data['sort_by']
        columns = form.cleaned_data['columns']

是否有一種簡單的方法來聲明可以以Django形式*重復一個字段,或者如果不是這樣,是否有一種方法可以捕獲所有返回的數據進行預清理/驗證以獲取所有列?

*我不希望Django為我構建前端,我可以做到。 我只是在尋找一種讓django在返回多個字段時不抱怨的方法

是的,還有另一種方法可以做到這一點。

而不是以這種形式聲明所有字段,

class TableBuildingForm(forms.Form):
    data_set = forms.ChoiceField(choices=DATASETS,required=True,label="Initial object")
    col1 = forms.CharField(label='Column 1', max_length=100, required=False)
    col2 = forms.CharField(label='Column 2', max_length=100, required=False)
    col3 = forms.CharField(label='Column 3', max_length=100, required=False)
    col4 = forms.CharField(label='Column 4', max_length=100, required=False)
    col5 = forms.CharField(label='Column 5', max_length=100, required=False)
    sort_by = forms.CharField(label='Sort by', max_length=100, required=False)

在表單的__init__方法內聲明所有表單字段。 因為在GET和POST中創建表單時會調用__ini__ 因此,完成HTTP發布中值的綁定后,您將填充所有動態字段並正確綁定-

class TableBuildingForm(forms.Form):
    data_set = forms.ChoiceField(choices=DATASETS,required=True,label="Initial object")            
    sort_by = forms.CharField(label='Sort by', max_length=100, required=False)

    def __init__(self, data=None, files=None, instance=None, **kwargs):
        super().__init__(data=data, files=files, instance=instance, **kwargs)

        for x in xrange(10): # just a dummy for 10 values
            self.fields['col' + str(x)] = forms.CharField(label='Column ' + str(x), max_length=100, required=False)

然后,在clean方法中,您可以獲取值-

def clean(self):
    value = self.cleaned_data['field_' + str(0)]

這就是我填充具有動態元字段的表單的方式。

編輯:如果一個字段添加與JS

為此,請保留另一個字段名稱count

class TableBuildingForm(forms.Form):
        data_set = forms.ChoiceField(choices=DATASETS,required=True,label="Initial object")            
        sort_by = forms.CharField(label='Sort by', max_length=100, required=False)
        count = forms.HiddenField(required=False)

然后更新它將使用JS計數值。 舉例來說5;

然后更新您的init以考慮此值-

    def __init__(self, data=None, files=None, instance=None, **kwargs):
        super().__init__(data=data, files=files, instance=instance, **kwargs)
        _count = int(self.cleaned_data['count'])
        for x in xrange(_count ): # get values from count because it will be updated with js
            self.fields['col' + str(x)] = forms.CharField(label='Column ' + str(x), max_length=100, required=False)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM