模型在models.py中一起出血?

时间:2012-04-13 08:03:48

标签: python django model django-forms

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

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

'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

我之前将它们安排为Model-Modelform,Model-Modelform但是here它将它们显示为我现在拥有它们的方式。

编写表单还有什么好处吗?现在我更喜欢在表单上编写模型表单(我不认为它们有很多不同)但如果我只编写模型表单,我会错过功能吗?那么有什么我错过了如何在models.py中编写多个表单或者我是否将它们写成了文件?或者我不能通过命令syncdb创建它们吗?

3 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分: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属性。

答案 2 :(得分: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__()