【问题标题】:Django: Fields not found?Django:找不到字段?
【发布时间】:2015-10-16 15:18:22
【问题描述】:

我不断收到错误

ImproperlyConfigured at /messages/compose/
Creating a ModelForm without either the 'fields' attribute or the 'exclude' attribute is prohibited; form ComposeForm needs updating.

我完全理解错误指出了什么,但我不明白为什么它首先出现?

这是 django 想要我更新的表单:

from django import forms
from .models import DirectMessage

class ComposeForm(forms.ModelForm):
    class Meta:
        model = DirectMessage

这是我的模型(包含字段):

from django.db import models
from django.contrib.auth.models import User

# Create your models here.
user_obj = User.objects.get(username = 'jess')

class DirectMessage(models.Model):
    subject = models.CharField(max_length =150)
    body = models.CharField(max_length =3000)
    sender = models.ForeignKey(User, related_name='sent_direct_messages', null=True, blank=True)
    receiver = models.ForeignKey(User, related_name='recieved_direct_messages', null=True, blank=True)
    sent = models.DateTimeField(auto_now_add=False, auto_now=False, null=True, blank=True)
    read = models.DateTimeField(auto_now_add=False, auto_now=False, null=True, blank=True)

    def __unicode__(self):
        return self.subject 

也许我的语法有问题,或者我错过了一个明显的基本错误。任何帮助将不胜感激,如果您需要更多信息/上下文,请告诉我。谢谢!

【问题讨论】:

    标签: python django django-models django-forms


    【解决方案1】:

    我完全理解错误指出的是什么,但我不明白 了解它为什么首先出现?

    错误...因为您的 ModelForm 没有明确指定 fields 列表或 exclude 列表?

    这是 django 想要我更新的表单: 类 DirectMessageAdmin(admin.ModelAdmin):

    这不是 ModelForm,这是 ModelAdmin。鉴于您的错误消息中的 url,我认为它与您的管理员没有任何关系...

    【讨论】:

    • ahhh,看起来在我的压力状态下我误读了错误。让我用我的表格更新问题
    【解决方案2】:

    正如Django documentation: Creating forms from models: Selecting the fields to use中所述:

    强烈建议您使用 fields 属性明确设置应在表单中编辑的所有字段。当表单意外地允许用户设置某些字段时,特别是在向模型添加新字段时,不这样做很容易导致安全问题。根据表单的呈现方式,问题甚至可能在网页上不可见。

    另一种方法是自动包含所有字段,或仅将某些字段列入黑名单。众所周知,这种基本方法的安全性要低得多,并导致主要网站上的严重漏洞(例如GitHub)。

    因此,无论模型中定义的字段如何,您都应该在 Meta 中显式包含一个 fields 变量。这必须是您需要在 ModelForm 中拥有的模型的所有字段的元组。您也可以将值指定为'__all__'

    这是introduced in Django 1.6:

    在 Django 1.6 中更改:

    在 1.6 版本之前,“all”快捷方式不存在,但省略字段属性具有相同的效果。省略这两个字段和排除现在已弃用,但在 1.8 版之前将继续像以前一样工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-25
      相关资源
      最近更新 更多