gpt4 book ai didi

django - 尝试访问 Django 模板中的 ModelForm 字段 modelChoice 选择

转载 作者:行者123 更新时间:2023-12-02 17:46:06 25 4
gpt4 key购买 nike

我正在生成 ModelForms 并希望对它们在我的模板中的输出方式进行精细控制。具体来说,我需要在每个选择列表中的每个单选按钮的末尾添加一些标记。

代码:

# order-form.html

{% load catname %}
<form id = "order-form">
{% for form in forms %}
<div id="gun-{{ forloop.counter }}">
{% for field in form.fields %}
<div id="{{ field }}-item" class="item">
<h3>{{ field|catname }}</h3>
{% for choice in form.field.choices %} {# <-- Help me out here #}
{{ choice.id }}
{{ choice.title }}
{% endfor %}
</div>
{% endfor %}
{% endfor %}
<button type="submit" id="standard-gun-form-submit">Continue to next step</button>
</form>

# views.py
def get_form(request):
if request.method == 'POST':
if request.POST['gun_type'] == 'standard':
forms = [StandardGunForm(prefix=p) for p in range(0,2)]
return render_to_response('main/order-form.html', {'forms' : forms,}, RequestContext(request))

# forms.py

class StandardGunForm(ModelForm):
def __init__(self, *args, **kwargs):
super(StandardGunForm, self).__init__(*args, **kwargs)
for field in self.fields:
if isinstance(self.fields[field], ModelChoiceField):
self.fields[field].empty_label = None

class Meta:
model = BaseGun
widgets = {
'FrameTuning' : RadioSelect(),
'FrameConnection' : RadioSelect(),
}
exclude = ('price')

Endgame:看起来像这样的标记

<form id="foo">
<div class="category">
<div class="item">
<input type="radio" name="srsbzns" value="1">Option 1</input>
<img src="http://placekitten.com/150/150">
<p>Other foo here</p>
</div>
<div class="item">
<input type="radio" name="srsbzns" value="2">Option 2</input>
<img src="http://placekitten.com/150/150">
<p>Other foo here</p>
</div>
<div class="item">
<input type="radio" name="srsbzns" value="3">Option 3</input>
<img src="http://placekitten.com/150/150">
<p>Other foo here</p>
</div>
</div>
</form>

从 shell 中,这返回了我想要的内容

>>> forms = [StandardGunForm(prefix=p) for p in range(0,2)]\
>>> forms[0].fields['frame_tuning'].choices.queryset

我很惊讶这被证明如此具有挑战性!

奖励:我启用了 DEBUG = True 和 Django 调试工具栏。是否可以将变量转储到浏览器,以便我在向下钻取时可以看到这些东西的样子?

谢谢!

最佳答案

我不得不做类似的事情并开始走这条路。我想从 ModelChoiceField 创建表格行,其中每一列都有模型实例的不同字段(然后我允许通过 JavaScript 过滤表格行)。

我在 Django 文档中找不到它,但快速阅读 Django 源代码找到了方法。您可以像这样访问查询集以访问模型实例:

<form action="{% url 'some_view' %}" method="post">
{% csrf_token %}
{% if form.non_field_errors %}
{{ form.non_field_errors }}
{% endif %}

{% for field in form %}
{{ field.label }}

{% if field.field.choices %}
{% for model_instance in field.field.choices.queryset %}
{{ model_instance.id }}
{% endfor %}
{% else %}
{{ field }}
{% endif %}

{% if field.errors %}
{{ field.errors|striptags }}
{% endif %}

{% endfor %}

<button type="submit">Submit</button>
</form>

但是,此时我们已经分解了 Shiny 的小部件(在我的例子中是 CheckboxSelectMultiple)并且必须使用模板代码重新组合 HTML 表单输入。我没有找到直接的方法来同时迭代 ModelChoiceField 以访问模型实例字段并获取选择的 HTML 表单标签。

也许有办法,但我放弃了我的尝试并构建了我自己的 HTML 表单,在一个 View 中处理所有 POST 数据。那样就容易多了。 ModelForms 真的很不错也很方便,但是将它们用于它们不是为之构建的东西最终会变得更加困难。

我想我会发布这个以防有人出于其他原因尝试这样做。希望对您有所帮助。

关于django - 尝试访问 Django 模板中的 ModelForm 字段 modelChoice 选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14307622/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com