gpt4 book ai didi

django - 如何用字符串覆盖表单文本框小部件?

转载 作者:行者123 更新时间:2023-12-04 06:09:45 25 4
gpt4 key购买 nike

对 django 和 python 来说还是相当新的......

我定义了两种形式如下:

 class PasswordForm(forms.Form):
def __init__(self, *args, **kwargs):
self.name={'label':'Name', 'data':''}

def get_name(self):
return self.name['data']

def set_name(self, name):
self.name['data'] = name

name = property(get_name, set_name)

pass1 = forms.CharField(max_length=20)
pass2 = forms.CharField(max_length=20)


class UserForm(PasswordForm):
name = forms.CharField(max_length=20)

我这样设置的原因如下:
  • 尝试使用单个模板来处理两种表单
  • 有时只想验证 PasswordForm 字段,有时只想验证 UserForm 和 PasswordForm 字段,因此有两个表单
  • 在模板中,有时希望将 name 显示为文本框输入,而有时则希望将 name 显示为显示 name 值的字符串(即不可编辑)

  • 我以为我可以在模板中循环如下内容
     {{ form.field.label }} {{ form.field }}

    最终发生的是开发服务器严重崩溃(即“python manage.py runserver”) - 没有错误消息,只是退出。

    显然,我做错了什么,但不知道是什么。是否可以用一个字符串覆盖文本框输入,这样模板就更不聪明了?如果是这样,我该怎么做?

    谢谢你的帮助!

    W.

    编辑:
    根据 Pasty Legs 的回答,要做的是覆盖使用的小部件。对 widgets.py 中的语法进行了一些调整,使其对我有用:
     from django.forms import widgets                                                                         
    from django.utils.safestring import mark_safe

    class StringWidget(widgets.Input):
    def render(self, name, value, attrs=None):
    # Create a hidden field first
    hidden_field = widgets.HiddenInput(attrs)
    return mark_safe(u'%s %s' % (value, hidden_field.render(value, attrs)))

    最佳答案

    为什么不使用禁用的输入而不是尝试替换它?

    http://reference.sitepoint.com/html/input/disabled

    class MyForm(forms.ModelForm):
    apple = models.CharField(widget=forms.TextInput(attrs={'disabled':'disabled'}))

    如果您需要动态决定是否将输入设置为禁用(与上面始终禁用的情况相反),您可以覆盖构造函数
    class MyForm(forms.ModelForm):

    apple = models.CharField(widget=forms.TextInput())

    def __init__(self, *args, **kwargs):
    super(MyForm, self).__init__(*args, **kwargs)
    if something:
    self.fields['apple'].widget.attrs["disabled"] = 'disabled'

    编辑
    要将字段显示为字符串,您需要覆盖小部件(即用于显示该表单字段的 HTML)。问题是,如果您不将文本包含在某种表单元素中,它会在表单提交时丢失。解决此问题的最简单方法是创建一个自定义小部件,将字符串和字符串显示为隐藏的输入文本字段:

    创建一个小部件.py:
    from django.forms import widgets
    class StringWidget(widgets.Input):
    def render(self, name, value, attrs=None):
    # Create a hidden field first
    hidden_field = widgets.HiddenField(attrs)
    return mark_safe(u'<p>%s</p>%s' % (value, hidden_field.render(value, attrs))

    表格.py
    from myapp.widgets import StringWidget
    class MyForm(forms.ModelForm):

    apple = models.CharField(widget=StringWidget())

    当您循环时,这将在您的模板中产生类似以下内容:
    <p>granny smith</p>
    <input type="hidden" class="..." name="id_apple" value="granny smith" />

    即用户将能够看到,但不能编辑它。

    关于django - 如何用字符串覆盖表单文本框小部件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7909044/

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