【问题标题】:Django ModelForm to have a hidden inputDjango ModelForm 有一个隐藏的输入
【发布时间】:2013-03-25 14:55:40
【问题描述】:

所以我有我的 TagStatus 模型。我正在尝试为它制作一个 ModelForm。但是,我的表单要求使用 {{ tag.name }} 填充隐藏的输入。我一直在查看文档,但我不知道如何使标签字段成为隐藏输入。也许 ModelForm 不适合?

models.py:

class TagStatus(models.Model):
    user = models.ForeignKey(User, null=True, unique=True)
    status = models.CharField(max_length=2, choices=tag_statuses)
    tag = models.ForeignKey(Tag, null=True, blank=True)

    def __unicode__(self):
        return self.status

    def save(self, *args, **kwargs):
        super(TagStatus, self).save(*args, **kwargs)

class TagStatusForm(modelForm):
    class Meta:
        model = TagStatus
        fields = ('status','tag') 
        widgets = {
             'select': Select,
             'tag': ???
        }

django views.py:

@login_required
def tags(request):
    all_tags = Tag.objects.all()
    context = base_context(request)
    if request.method == 'POST':
        if 'status_check' in request.POST:
            status_form = TagStatusForm(request.POST)
            #if request.is_ajax():
            if status_form.is_valid():
                status_form.save()
                response = simplejson.dumps({"status": "Successfully changed status"})
            else:
                response = simplejson.dumps({"status": "Error"})
                return HttpResponse (response, mimetype='application/json')
    status_form = TagStatusForm()
    context['status_form'] = status_form
    context['all_tags'] = all_tags
    return render_to_response('tags/tags.html', context, context_instance=RequestContext(request))

模板:

{% for tag in all_tags %}
....
<form class="nice" id="status-form" method="POST" action="">
     {% csrf_token %}
      <input type="hidden" name="status_check" />
      <input type='hidden' name="tag" value="{{ tag.name }}" />
     {{ status_form.status }}
</form>
...
{% endfor %}

我将如何通过 django ModelForm 进行隐藏输入,然后通过模板填充它?

【问题讨论】:

    标签: python django django-models django-forms


    【解决方案1】:

    要使 ModelField 中的字段成为隐藏字段,请使用 HiddenInput 小部件。 ModelForm 为所有字段使用合理的默认小部件,您只需要在构造对象时覆盖它。

    class TagStatusForm(forms.ModelForm):
        class Meta:
            model = TagStatus
            widgets = {'tag': forms.HiddenInput()}
    

    【讨论】:

      【解决方案2】:

      有 3 种可能的方式 (AFAIK) 在 Django 中呈现隐藏字段 -

      1.你可以在forms.py中正常声明一个字段,但在你的模板html文件中使用{{ form.field.as_hidden }}

      2.forms.py中直接使用隐藏的输入小部件。

      class MyForm(forms.Form):
          hidden_field = forms.CharField(widget=forms.HiddenInput())
      

      一旦您将该字段设置为隐藏输入,您就可以在模板中填充该字段的值。现在您的隐藏字段已准备好进行渲染。

      3. 等价的正则形式(感谢@Modelesq 分享此金块)。这里不涉及 Django。更改在 HTML 模板级别完成。 &lt;input type="hidden" name="tag" value="{{ tag.name }}" /&gt;

      【讨论】:

      • 我如何填充它?它的常规形式等效如下:&lt;input type="hidden" name="tag" value="{{ tag.name }}" /&gt;
      • 你找到如何填充了吗?使用{{ tag.name }} 似乎不起作用。我自己需要{{ forloop.counter }}...
      • 有没有机会添加模板方面的东西?
      【解决方案3】:

      我正在寻找一种隐藏所有输入的方法:

      class TagStatusForm(forms.ModelForm):
          class Meta:
              model = TagStatus
      
          def __init__(self, *args, **kwargs):
              super(TagStatusForm, self).__init__(*args, **kwargs)
              for field in self.fields:
                  self.fields[field].widget = forms.HiddenInput()
      

      【讨论】:

        【解决方案4】:

        我发布了一种使用基于类的通用视图的方法here

        from django.forms import HiddenInput
        
        from django.forms.models import modelform_factory
        
        _patient_create_form = modelform_factory(
            models.Patient,
            fields=['name', 'caregiver_name', 'sex', 'birth_date',
                    'residence', 'country'],
            widgets={'country': HiddenInput()})
        
        class PatientCreate(LoginRequiredMixin, UserOrgRequiredMixin, CreateView):
            form_class = _patient_create_form
            template_name = 'healthdbapp/patient_form.html'
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-05-01
          • 2013-08-18
          • 2014-09-23
          • 1970-01-01
          • 2019-03-11
          • 2017-11-13
          • 2017-08-16
          相关资源
          最近更新 更多