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 回答