在表单中保存Django用户

时间:2012-02-25 00:26:58

标签: django django-models django-forms

我目前正在制作我的第一个Django应用程序,它允许注册用户通过基本表单提交内容。

到目前为止,它有一点需要注意:当显示表单时,向用户(“作者”)显示所有用户的下拉列表,而不是使用用户的名称自动填充该字段。这显然是不可接受的。

此目标是让注册用户的名称自动填充表单。我已经看到了类似问题的各种潜在解决方案,但没有解决任何具体问题。

我尝试将模型中的“作者”字段设置为“unique = True”,但在迁移时会导致数据库错误。

非常感谢任何见解:

型号:

class Story(models.Model):
    title = models.CharField(max_length=100)
    topic = models.CharField(max_length=50)
    copy = models.TextField()
    author = models.ForeignKey(User)
    zip_code = models.CharField(max_length=10)
    latitude = models.FloatField(blank=False, null=False)
    longitude = models.FloatField(blank=False, null=False)
    date = models.DateTimeField(auto_now=True, auto_now_add=True)   
    def __unicode__(self):
         return " %s" % (self.title)

形式:

class StoryForm(forms.ModelForm):
class Meta:
    model = Story

查看:

@login_required
 def submit_story(request):
if request.method == "GET":
    story_form = StoryForm()
    return render_to_response("report/report.html",
                             {'form': story_form},
                              context_instance=RequestContext(request))
elif request.method =="POST":
    story_form = StoryForm(request.POST) 
    if story_form.is_valid():
        new_story = Story()
        new_story.title = story_form.cleaned_data["title"]
        new_story.topic = story_form.cleaned_data["topic"]
        new_story.copy = story_form.cleaned_data["copy"]
        new_story.author = request.user
        new_story.zip_code = story_form.cleaned_data["zip_code"]
        new_story.latitude = story_form.cleaned_data["latitude"]
        new_story.longitude = story_form.cleaned_data["longitude"]
        new_story.save()
        return HttpResponseRedirect("/report/all/")
    else:
        story_form = StoryForm()
        return render_to_response("report/report.html",
                                {'form': story_form},
                                 context_instance=RequestContext(Request))
编辑:我想我找到了一个相对简单的答案:我刚刚从表单中删除了“作者”字段并保持了相同的视图。我能够以这种方式在注册用户的名下发帖。我认为这有效,除非我不知道(很多)是不正确或不好的协议。

1 个答案:

答案 0 :(得分:2)

我设法做了类似的事情:

与用户关联的所有模型的基类:

class UserOwnedModel(models.Model):
    user = models.ForeignKey(User, editable=True)

    class Meta:
        abstract = True

与用户关联的所有表单的基类:

class UserOwnedForm(forms.ModelForm):
    exclude = ["user", ]

    def __init__(self, user, data=None, *arguments, **keywords):
        if data:
            data['user'] = user.id
            forms.ModelForm.__init__(self, data=data, *arguments, **keywords)

我不确定这是否是最佳解决方案(并且会对任何输入或建议感到高兴)但它对我有用。 这当然会从表单中完全删除用户字段,因此如果您需要显示用户名,则必须使用代码。


修改

此外,而不是:

new_story = Story()
new_story.title = story_form.cleaned_data["title"]
new_story.topic = story_form.cleaned_data["topic"]
new_story.copy = story_form.cleaned_data["copy"]
new_story.author = request.user
new_story.zip_code = story_form.cleaned_data["zip_code"]
new_story.latitude = story_form.cleaned_data["latitude"]
new_story.longitude = story_form.cleaned_data["longitude"]
new_story.save()

你可以这样做:

new_story = story_form.save()

编辑2

这样的事情:

class Story(UserOwnedModel):
    title = models.CharField(max_length=100)
    topic = models.CharField(max_length=50)
    copy = models.TextField()
    zip_code = models.CharField(max_length=10)
    latitude = models.FloatField(blank=False, null=False)
    longitude = models.FloatField(blank=False, null=False)
    date = models.DateTimeField(auto_now=True, auto_now_add=True)   
    def __unicode__(self):
         return " %s" % (self.title)

class StoryForm(UserOwnedForm):
    class Meta:
        model = Story

@login_required
def submit_story(request):
    if request.method == "GET":
        story_form = StoryForm(user=request.user)
    ....
    elif request.method =="POST":
        story_form = StoryForm(data=request.POST, user=request.user)
        if story_form.is_valid():
            new_story = story_form.save()
            .....
        else:
            story_form = StoryForm(user=request.user)
            ....

我也改变了我的初始代码。