1

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として配置していましたが、ここでは現在の方法として示しています。

また、フォームだけを書くことには何か利点がありますか?今のところ、フォームよりもモデルフォームを書く方が快適です(モデルフォームが大きく異なるとは思いません)が、モデルフォームだけを書いた場合、機能を見逃してしまうでしょうか?それで、models.pyで複数のフォームを書く方法について私が見逃したことはありますか、それともそれらをweargで書いたのですか?または、コマンドsyncdbを使用してそれらを作成することはできませんか?

4

3 に答える 3

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

It doens't make sense inside CashtextsForm as that does not "know" a subject attribute.

于 2012-04-13T08:32:19.027 に答える
0

はい、フォームには実際にはありません。定義をsubject削除するだけで、すべて問題ありません。__unicode__

これは、djangoコードの宣言型のスタイルによるものです。オブジェクトを検査したい場合は、pdbモジュールとdirビルトインを使用してください。

ほとんどの場合、ModelFormサブクラスを使用しますが、モデルから作成できないフォームが必要になる場合があります。この場合、djangoはそのようなフォームを記述し、フォームクリーンとフィールド検証を使用するのに役立ちます。

于 2012-04-13T08:15:45.643 に答える
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 に答える