【问题标题】:pass attrs to BoundField.as_widget() django将 attrs 传递给 BoundField.as_widget() django
【发布时间】:2021-01-28 22:08:35
【问题描述】:

我想通过BoundField.as_widget() 将HTML 属性传递给方法中的attrsDjango doc

BoundField.as_widget(widget=None, attrs=None, only_initial=False)¶

通过渲染传递的小部件来渲染字段,添加作为 attrs 传递的任何 HTML 属性。如果未指定小部件,则将使用该字段的默认小部件。

所以我尝试像这样传递属性:BoundField.as_widget(attrs={'class': 'container'}),但没有成功。

forms.py

class HiddenForm(forms.Form):
    testfield = forms.CharField(max_length=100, widget=forms.HiddenInput())

class BlahForm(forms.ModelForm):
    class Meta:
        model = Blah

views.py。模型Blah 是与模型A 的一对一字段关系。

def myview(request, arg):
    a = get_object_or_404(A, somefieldname=arg)
    initial = {'blah': a}
    form = BlahForm(request.POST or None, initial=initial) # ModelForm from Model Blah
    value = a.pk 

    hidden_input = HiddenForm(request.POST or None)
    hidden_input['testfield'].as_widget(attrs={'value': value }) # This is the reason I want to pass attrs with as_widget. I want to pass value to the hidden input form, so that the hidden form can handle submitting disabled form value, which I did on purpose to keep user from changing the value.

    if form.is_valid():
        form.save()
        return redirect('somewhere', someparameter=arg)
    context = {
            'form': form,
            'value': value,
            'hidden_input': hidden_input
            }
    return render(request, 'someapp/sometemplate.html', context)

一些模板.html

<form method="post">
  {% csrf_token %}
  {{ form|crispy }}
  {# disabled input data not submitted, so submit it with hidden data #}
  <input type="hidden" name="blah" value="{{ value }}"> <!-- hard coded part, which I try to avoid -->
  {{ hidden_input }} <!-- What I want -->
  <button class="btn btn-primary" type="submit">저장</button>
</form>

以及我在下面看到的开发者控制台页面:

<input type="hidden" name="blah" value="2632"> <!-- hard coded -->
<input type="hidden" name="blah" id="id_blah"> <!-- rendered with {{ hidden_input }}-->

据我了解,Django 不鼓励将设计直接放在模板中,而是将业务模型放在视图和其他.py 文件中,所以我希望我的模板看起来更优雅。

谁能告诉我我错过了什么,或者做错了什么?

提前感谢您的建议。

【问题讨论】:

    标签: python html django


    【解决方案1】:

    当您在HiddenForm 中的字段上定义小部件时,您应该传递这些属性:

    class HiddenForm(forms.Form):
        testfield = forms.CharField(max_length=100, widget=forms.HiddenInput(attrs={'value': value }))
    

    如果你想在你的视图中动态传递attrs,那么这样做:

    hidden_input['testfield'].field.widget.attrs.update({'value': 'value'})
    

    或者:

    hidden_input['testfield'].field.widget.attrs = {'value': 'value'}
    

    或者您可以完全更改小部件:

    hidden_input['testfield'].field.widget = forms.HiddenInput({'value': value })
    

    【讨论】:

    • 感谢您的评论。我知道在forms.py 中定义表单时我可以输入attrs。我想知道是否有任何方法可以在views.py中做类似的事情,因为value是在views中定义的。
    • 更新了我的答案
    猜你喜欢
    • 2021-01-28
    • 1970-01-01
    • 2023-03-03
    • 2012-11-13
    • 2016-08-02
    • 2019-03-24
    • 2014-12-12
    • 2010-12-31
    • 2019-06-13
    相关资源
    最近更新 更多