Django - 指定 django.db.models.(???) 字段形式的宽度

Posted

技术标签:

【中文标题】Django - 指定 django.db.models.(???) 字段形式的宽度【英文标题】:Django - Specify width of django.db.models.(???)Field forms 【发布时间】:2015-12-01 18:20:40 【问题描述】:

正如标题所说,我正在尝试缩小 Django 页面上几个字段的宽度。主要是CharFieldDecimalFieldIntegerField,如果这有什么不同的话。

这是其中一个字段的示例

title = models.CharField(max_length=200)

我发现其他人使用了小部件但无法使其工作,这既是因为我不确定如何使用这些小部件,也可能是因为这些示例似乎都在使用 django.forms.CharField。这是指向此类an example 的链接。我试过这样的例子:

title = models.CharField(max_length=200, widget=forms.Textarea(attrs='cols': 10, 'rows': 20))

还有:

title = models.CharField(max_length=200, widget=models.Textarea(attrs='cols': 10, 'rows': 20))

import django.db.modelsimport django.forms

这是我更新的文件:

models.py

class ChemRun(forms.Form):
    title           =       forms.CharField(max_length=50, widget=forms.TextInput(attrs='style': 'width: 400px;' ))
    created_date    =       forms.DateTimeField(initial=timezone.now)
    status          =       forms.CharField(max_length=20, initial="In queue")

forms.py

class ChemRunForm(forms.Form):
    class Meta:
            model = ChemRun
            exclude = ('created_date', 'status')

views.py

@verified_email_required
def create(request):
    if request.POST:
            form = ChemRunForm()
            f = form.save(commit=False)
            f.owner = request.user
            f.save()
            data = form.cleaned_data
            initiate_run.delay(data)
            return HttpResponseRedirect('/accounts/profile')
    else:
            form = ChemRunForm()

    args = 
    args.update(csrf(request))
    args['form'] = form

    return render_to_response('interface/newrun.html', args, context_instance=RequestContext(request))

【问题讨论】:

真的很重要吗?它在底层 SQL 中将被定义为“title”varchar(200) NOT NULL。由于它是一个 varchar,因此即使缩小它也不会产生太大影响。 ***.com/questions/1962310/… 【参考方案1】:

您可以通过几种方式进行设置...

你可以做到这一点,而无需定义小部件,只需在元素上设置 html 'style' 属性

选项 1

class MyForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(MyFormForm, self).__init__(*args, **kwargs)
        self.fields['title'].widget.attrs['style'] = "width:200px"

选项 2

class MyForm(forms.ModelForm):
    class Meta:
        model = Foo
        'widgets' = 
            'title' = forms.CharField(attrs='size':'80'),
        

选项 3

   class MyForm(forms.ModelForm):
        title = models.CharField(max_length=200, widget=forms.CharField(attrs='size':'80')

【讨论】:

感谢您的回答。这现在使用 forms.modelForm 和 forms.CharField,而我使用的是 models.ModelForm 和 models.CharField。我还没有真正理解models.ModelForms和forms.ModelForms之间的区别,我一直不愿意改变,因为它可能会导致更多问题。有没有办法使用models.ModelForm来做到这一点,还是我改成forms.ModelForm更好? 所以表单可以是绑定的也可以是未绑定的。您正在尝试使用绑定表单,因为您正在使用 models.CharField - 在此处阅读更多信息 effectivedjango.com/forms.html 。所以你可以这样想:models.CharField 处理数据组件,而forms.CharField 让你能够处理未绑定的表单,还可以操作小部件、标签、帮助文本等。基本上是表单的呈现方式。 好的,我想我已经掌握了它的基础知识,谢谢。现在我得到了新的错误而不是TypeError: 'DeclarativeFieldsMetaclass' object is not iterable 我还从我的模型、表单和视图文件中添加了示例 第一件事——class ChemRun(forms.Form): 需要继承自models.Model——因为它是一个模型! - 你的字段也一样——你在你的models.py中描述你的模型的行为,所以字段也需要引用这个title = models.CharField(max_length=50)。对于status = forms.CharField(max_length=20, initial="In queue"),这变为status = models.CharField(max_length=20) - 请注意initialforms.CharField 参数,而不是models.CharField 参数

以上是关于Django - 指定 django.db.models.(???) 字段形式的宽度的主要内容,如果未能解决你的问题,请参考以下文章

Django - 指定 django.db.models.(???) 字段形式的宽度

DJANGO_SETTINGS_MODULE - 未加载指定的设置文件?

Django - 如何指定验证失败的字段?

Django:在不指定主键的情况下创建固定装置?

PyCharm 创建指定版本的 Django (超详细图解)

pycharm新建django项目时报错