1

在 Django 中,我正在尝试为 ContactForm 编写 ModelForm,当我尝试加载包含表单的页面时,它说它不存在。然后,当我尝试渲染我之前写的另一种形式时,它说

Caught AttributeError while rendering: 'CashtextsForm' object has no attribute 'subject'

“主题”是我试图在 ContactForm 中呈现的表单中的一个字段。那么我必须在models.py中列出它们吗?这是代码:

# Create your models here.
from django.db import models
from django.forms import ModelForm

class Cashtexts(models.Model):
    cashTexts = models.CharField(max_length=100, blank=True) #change me to a website filter
    superPoints = models.CharField(max_length=100, blank=True)#chance to "superPoints _Username"
    varolo = models.CharField(max_length=100, blank=True)
    swagbucks = models.CharField(max_length=100, blank=True)
    neobux = models.CharField(max_length=100, blank=True)
    topline = models.CharField(max_length=100, blank=True)
    Paidviewpoint = models.CharField(max_length=100, blank=True)
    cashcrate = models.CharField(max_length=100, blank=True)


    def __unicode__(self):
        return self.cashcode

class Contact(models.Model):
    sender = models.EmailField()
    subject = models.CharField(max_length=25)
    message = models.TextField()

class CashtextsForm(ModelForm):
    class Meta:
        model = Cashtexts

    def __unicode__(self):
        return self.subject


class ContactForm(ModelForm):
    class Meta:
        model = Contact

我以前将它们排列为模型-模型形式,模型-模型形式,但在这里它以我现在拥有它们的方式显示它们。

另外,只写表格有什么好处吗?现在我更习惯于编写模型表单而不是表单(我不认为它们有什么不同)但是如果我只编写模型表单,我会错过功能吗?那么关于如何在models.py中编写多个表单或者我是否将它们写成wearg,我有什么遗漏的吗?或者我不能通过命令syncdb 创建它们吗?

4

3 回答 3

0

主题字段是在模型中而不是在模型表单中定义的,因为模型表单可以在没有模型实例的情况下进行初始化,因此执行以下操作是不安全的:

def __unicode__(self):
    return self.instance.subject

你能做什么(但我真的不明白这样做的意义):

def __unicode__(self):
    if getattr(self, 'instance') is not None:
        return self.instance.subject
    return super(CashtextsForm, self).__unicode__()
于 2012-04-13T09:20:58.123 回答
0

__unicode__(self)方法应该是您的Contact课程的一部分

class Contact(models.Model):
    sender = models.EmailField()
    subject = models.CharField(max_length=25)
    message = models.TextField()

    def __unicode__(self):
        return self.subject

它在内部没有意义,CashtextsForm因为它不“知道”一个subject属性。

于 2012-04-13T08:32:19.027 回答
0

是的,您的表单确实没有subject,只需删除__unicode__定义,一切都会好起来的。

这是因为 django 代码的声明式风格。如果你想检查你的对象使用pdb模块和dir内置。

您几乎每次都会使用 ModelForm 子类,但有时您需要一个无法从模型构建的表单。在这种情况下,django 将帮助您描述此类表单并使用表单清理和字段验证。

于 2012-04-13T08:15:45.643 回答