如何在Django中添加N个动态表单字段而不使用javascript/ajax?

2024-10-02 20:32:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个模型是这样的:

class AddCoffee(models.Model):
    user = models.CharField(max_length=50)
    coffee_name = models.CharField(max_length=50)
    coffee_price = models.CharField(max_length=10)

现在,从这个模型中,我得到了所有的coffee_name

coffee_names = AddCoffee.objects.values_list('coffee_name', flat=True)

现在,我想做的是(即使这里有一些密切相关的话题,我也找不到任何方法):

  • 生成len(coffee_names)ChoiceField,标签是每个咖啡名,值是从0到50的列表。像这样:

    class RequestCoffeeForm(forms.Form):
        coffee_names = AddCoffee.objects.values_list('coffee_name', flat=True)
    
        for name in coffee_names:
            forms.ChoiceField(label="{}".format(name),
                              choices=[x for x in range(51)])
    
        """
        Suppose coffee_names = ["ABC", "DEF"]
    
        I should have two `ChoiceFields` as follows:
    
        ABC = forms.ChoiceField(label="ABC", choices=[x for x in range(51)])
        DEF = forms.ChoiceField(label="DEF", choices=[x for x in range(51)])
        """
    

我怎样才能做到这一点?关于以后如何将这些动态字段存储在模型/视图中,我的脑子里有些模棱两可。你知道吗


我试过:

class RequestCoffeeForm(forms.Form):
    coffee_names = AddCoffee.objects.values_list('coffee_name', flat=True)

    for name in coffee_names:
        name = forms.ChoiceField(label="{}".format(name), choices=((str(x), x) for x in range(51)))

在我看来:

@login_required(login_url="login/")
def request_coffee_page(request):
    form = RequestCoffeeForm(request.POST or None)

    return render(request, "request_coffee.html", {'form': form})

然后在我的模板中:

{{ form.name.label_tag }}
{{ form.name }}

上面只打印最后一个咖啡名。我怎样才能把它们全部打印出来?你知道吗


Tags: namein模型formfornamesmodelsrequest
2条回答
class RequestCoffeeForm(forms.Form):
    COFFEE_CHOICES = []
    coffee_names = AddCoffee.objects.values_list('coffee_name', flat=True)

    for name in coffee_names:
        COFFEE_CHOICES.append((str(name).lower(), str(name)))
    forms.ChoiceField(choices=CHOICES_LIST)

choices必须是iterable of 2-tuples。有关示例,请参见here。你知道吗

我没时间试一下,但这可能有用吗

class RequestCoffeeForm(forms.Form):
    def __init__(self, *args, **kwargs):
        super(RequestCoffeeForm, self).__init__(*args, **kw)

        choices = [(str(x), x) for x in range(51)]
        # store it as attribute in case we need it later...
        self.coffee_names = AddCoffee.objects.values_list('coffee_name', flat=True)

        for name in self.coffee_names:
            self.fields[coffee_name] = forms.ChoiceField(
                label=coffee_name, choices=choices
                )

相关问题 更多 >