【问题标题】:Creating a dynamic Form Django创建动态表单 Django
【发布时间】:2016-11-11 06:07:38
【问题描述】:

考虑这些 Django 模型:

class MonitorSession(models.Model):
    agent = models.ForeignKey(Agent, on_delete=models.CASCADE)
    date = models.DateTimeField()
    contact_motive = models.ForeignKey(ContactMotive)
    customer_number = models.CharField(max_length=65)
    protocole_number = models.CharField(max_length=65)
    strong_points = models.TextField(blank=True)
    points_to_improve = models.TextField(blank=True)
    action_plan = models.TextField(blank=True)

    def __unicode__(self):
        return u"%s, %s" % (self.customer_number, self.protocole_number)

class EvaluationCategory(models.Model):
    cel = models.ForeignKey(Cel, on_delete=models.CASCADE)
    category = models.CharField(max_length=65)
    description = models.TextField(blank=True)
    max_points = models.IntegerField()

def __unicode__(self):
    return u"%s: %s" % (self.cel, self.category)


class EvaluationItem(models.Model):
    category = models.ForeignKey(EvaluationCategory, on_delete=models.CASCADE)
    item = models.CharField(max_length=65)

    def __unicode__(self):
        return u"%s: %s" % (self.category, self.item)

class EvaluationScore(models.Model):
    monitor_session = models.ForeignKey(MonitorSession, on_delete=models.CASCADE)
    item = models.ForeignKey(EvaluationItem, )
    score = models.ForeignKey(PossibleScore, on_delete=models.CASCADE)

    def __unicode__(self):
        return u"%s: %s" % (self.item, self.score)

现在我需要使用 MonitorSession 类中的所有字段创建一个表单。

在这些字段之后,我需要创建额外的动态表单字段,并且将从该查询返回:

fields = EvaluationItem.objects.all().order_by(EvaluationCategory__category)

您可以想象一下,字段的数量是未知的并且是动态的。

在 Django 中是否有一种自动化的方式来完成这项工作? Ar 我是否必须手动创建表单并为 Item 字段创建一个循环?我一直在尝试使用 Formsets 来完成这项工作,但我看不出 formsets 可以如何帮助我。

【问题讨论】:

  • 我最近遇到了类似的问题。这篇博文对我的成功很有帮助jacobian.org/writing/dynamic-form-generation
  • 嗨,这确实是工作的一部分!
  • 我无法让它工作。在我看来,来自 jacobian 的代码没有得到足够的参考。没有模型。我完全处于黑暗中;(

标签: python django forms


【解决方案1】:

上述建议给了我部分解决方案:这将是我的表单的代码:

class MonitorSessionForm(forms.Form):
    agent = forms.ModelChoiceField(queryset=Agent.objects.all())
    date = forms.DateField()
    contact_motive =forms.ModelChoiceField(queryset=ContactMotive.objects.all())
    customer_number = forms.CharField(max_length=65)
    protocole_number = forms.CharField(max_length=65)
    strong_points = forms.CharField(widget=forms.Textarea)
    points_to_improve = forms.CharField(widget=forms.Textarea)
    action_plan = forms.CharField(widget=forms.Textarea)

    def __init__(self, *args, **kwargs):
        extra = kwargs.pop('extra')
        super(MonitorSessionForm, self).__init__(*args, **kwargs)

    for i, item in enumerate(extra):
        self.fields['custum_%s' % i] = forms.CharField(label=item) 

我的模板代码:

{% load bootstrap3 %}
<h2>Fazer Monitoria</h2>
<div class="col-md-6">
    <form method="post" action="">
     {% csrf_token %}
             {% bootstrap_form form %}
         <br><br>
     <input type="submit" name="submit" value="Salvar Monitoria" class="btn btn-primary">
     </form>
     <br><br> 
 </div>

还有我的查看代码:

@login_required()
def add_monitorsession(request):
     items = EvaluationItem.objects.all()
     if request.method == 'POST':
     form = MonitorSessionForm(request.POST, extra=items)
     if form.is_valid():
        print u'Tudo ok!'
else:
     form = MonitorSessionForm
return render_to_response('add_monitorsession.html', {'form': form})

试图渲染这给了我一个关键错误:

 KeyError at /addmonitorsession/
 'extra'
 Request Method:    GET
 Request URL:   http://127.0.0.1:8000/addmonitorsession/
 Django Version:    1.9.6
 Exception Type:    KeyError
 Exception Value:   
 'extra'
 Exception Location:         ..../monitoria_altocontato/main/forms/monitor_session.py in __init__, line 19

指出表格的下一行

        extra = kwargs.pop('extra')

有什么想法吗?

【讨论】:

    猜你喜欢
    • 2012-05-21
    • 2021-06-03
    • 2019-05-05
    • 2018-11-17
    • 2021-03-10
    • 1970-01-01
    • 2017-01-31
    • 1970-01-01
    相关资源
    最近更新 更多