gpt4 book ai didi

python - 指示输入类型的 Django 表单

转载 作者:太空狗 更新时间:2023-10-30 00:44:18 25 4
gpt4 key购买 nike

恐怕我正在努力解决另一个基本问题。我浏览了各种 Django 文档页面,还搜索了这个站点。我在这里发现的唯一一件事是在 2013 年,它建议设置自定义过滤器模板。

无论如何,我正在尝试生成我自己的表单,而不是使用 Django 自己的通过 {{ form }} 生成它的方式。这很简单,所以我可以控制表单的呈现方式。

我已经想出了各种方法来访问所需的信息,例如(在我的 for item in form 循环中);

  • item.help_text
  • item.label_tag
  • item.id_for_label

我正在尝试识别项目类型,以便我可以使用正确的输入类型,但是我正在努力锻炼 item.xxxx 应该是什么。由于这是通过 {{ form }} 正确显示的,我假设此信息在表单中的某处可用,只是努力找出如何访问它以便我可以识别正确的输入类型。我手动执行此操作,因此我可以使用正确的 Bootstrap 样式来显示输入字段。

任何帮助将不胜感激(或只是指向正确的方向)。我对此很陌生,所以对于我的非常基本的问题深表歉意,如果不认识我可以去问这些问题的人,这很困难。

问候

韦恩

不确定您是否需要它,但这里有一些代码;

表格:

class NewsForm(ModelForm):
class Meta:
model = News_Article
exclude = ('news_datetime_submitted', 'news_yearmonth', )
labels = {
'news_title': _('Enter News Title'),
}
help_texts = {
'news_title': _('Enter a title to give a short description of what the news is.'),
}
error_messages = {
'news_title': {
'max_length': _("News title is too long."),
},
}

查看(尚未在 POST 位上工作,这正是 Django 文档中的内容,POST 是我接下来要解决的问题)

def create(request, dataset):
if dataset not in ['news', 'announcement']:
return HttpResponseRedirect(reverse('pages'))
rDict = {}
if request.method == 'POST':
if dataset == "news":
form = NewsForm(request.POST)
elif dataset == "announcement":
form = AnnouncementForm(request.POST)
if form.is_valid():
return HttpResponseRedirect('/home/')
else:
pass
else:
announcement = get_announcement()
if not announcement == None:
rDict['announcement'] = announcement
if dataset == "news":
rDict['form'] = NewsForm()
rDict['branding'] = {'heading': 'Create News Item', 'breadcrumb': 'Create News', 'dataset': 'create/' + dataset + '/'}
elif dataset == "announcement":
rDict['form'] = AnnouncementForm()
rDict['branding'] = {'heading': 'Create Announcement', 'breadcrumb': 'Create Announcement', 'dataset': 'create/' + dataset + '/'}
rDict['sitenav'] = clean_url(request.path, ['"', "'"])
rDict['menu'] = Menu.objects.all().order_by('menu_position')
# pdb.set_trace()
return render(request, 'en/public/admin/admin_create.html', rDict)

模板代码

<form action="/siteadmin/{{ branding.dataset }}" method="post">
{% csrf_token %}
{% for item in form %}
<div class="row">
<div class="col-xs-2 col-md-2">
</div>
<div class="col-xs-4 col-md-4">
<div class="panel-title pull-right">
{% if item.help_text %}
<img src="/static/images/info.png" height="20" width="20" aria-hidden="true" data-toggle="popover" title="{{ item.help_text }}">&nbsp
{% endif %}
{{ item.label_tag }}
</div>
</div>
<div class="col-xs-4 col-md-4">
<div class="input-group">
<input type="{{ item.widget }}" class="form-control" placeholder="" aria-describedby="{{ item.id_for_label }}">
</div>
</div>
<div class="col-xs-2 col-md-2">
{% if forloop.last %}
<input type="submit" value="Submit" />
{% endif %}
</div>
</div>
{% endfor %}
</form>

最佳答案

试试这个:

<input type="{{ item.field.widget.input_type }}" ...

没有指向文档的链接,使用调试器找到它(不是最佳实践,我知道...)

根据@Smurf 的评论,这不适用于所有小部件,例如SelectCheckBox、任何MultiWidget 等...似乎只适用于文本输入及其变体(密码、电子邮件...)


更好的解决方案是创建自定义小部件并像往常一样在模板中呈现表单字段。您可以在那里设置任何自定义属性,请参阅 https://docs.djangoproject.com/en/1.8/ref/forms/widgets/#customizing-widget-instances


如果您绝对必须修改模板中的小部件,请使用 django-widget-tweaks

这个应用程序提供了一个漂亮的表单过滤器来改变小部件(即它们的属性)。但请注意,它是通过与已呈现的 HTML 进行字符串混搭来实现的(“呈现”与 Widget 实例有关)。

关于python - 指示输入类型的 Django 表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31538338/

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