0

現在ログインしているユーザーが新しいステータスを投稿できるフォームを作成しようとしています。モデルフォームを使用しています。ページを読み込んでもエラーは発生しませんが、データが投稿されていないようです。だから私の質問は、これを取得して現在のユーザーの新しいステータスを投稿する方法ですか? これが私の現在のコードです:

私の見解:

@login_required
def post(request, username):
    logged_user = request.user
    newpostform = PostForm(instance=request.user.get_profile(), data=request.POST)
    if newpostform.is_valid():
        newpostform.save()
    newpostform = PostForm()
    context = {'newpostform': newpostform,}
    return render(request, 'twitterclone/newpost.html', context)

私のフォーム:

class PostForm(ModelForm):
    class Meta:
        model = Post

私のモデル:

class Profile(models.Model):
    user = models.ForeignKey(User)
    bio = models.TextField()
    image = models.ImageField(upload_to='images/%Y/%m/%d')
    following = models.ManyToManyField('self', blank = True, null = True)

    def __unicode__(self):
        return unicode(self.user)

class Post(models.Model):
    profile = models.ForeignKey(Profile)
    body = models.CharField(max_length=140)
    pub_date = models.DateTimeField(auto_now_add=True)

    def __unicode__(self):
        return unicode(self.body[:50])

私のテンプレート:

<form action="" method="POST">
{% csrf_token %}
{{newpostform.body}}
<button>Tweet It</button>
</form>
4

1 に答える 1

1

テンプレートprofileには必須のフィールドが含まれていないため、フォームは決して有効ではありません。毎回新しいフォームを作成しているため、エラー メッセージは表示されませんが、テンプレートでエラー メッセージが表示されるわけではありません。

フォーム定義で、本文のみが必要であることを指定します。

class PostForm(ModelForm):
    class Meta:
        model = Post
        fields = ['body']

これにより、フォームが検証されます。profileまた、フィールドを明示的に設定する必要があります。

if newpostform.is_valid():
    newpost = newpostform.save(commit=False)
    newpost.profile = request.user.get_profile()
    newpost.save()

そしてinstance、フォームコンストラクターへの引数は、あなたが思っていることをしていません-それは、フォームが編集のために表すモデルの既存のインスタンスを渡すためです。

ビューを次のように書き直します。

@login_required
def post(request, username):
    newpostform = PostForm(data=request.POST)
    if newpostform.is_valid():
        newpost = newpostform.save(commit=False)
        newpost.profile = request.user.get_profile()
        newpost.save()            
        newpostform = PostForm()
    context = {'newpostform': newpostform,}
    return render(request, 'twitterclone/newpost.html', context)

ここでは、送信されたばかりのフォームが有効でない限り、フォームを新しい空のフォームに再割り当てしません。これにより、テンプレートがエラー メッセージを表示できるようになります。

于 2013-10-08T22:58:50.470 に答える