在表单中保存Django用户

在表单中保存Django用户,django,django-models,django-forms,Django,Django Models,Django Forms,我目前正在开发我的第一个Django应用程序,它允许注册用户通过基本表单提交内容 到目前为止,它有一个警告:当显示表单时,用户(“作者”)将看到一个所有用户的下拉列表,而不是自动用用户名填充该字段。这显然是不能接受的 这个目标是让注册用户的名字自动填充表单。我已经看到了一些类似问题的潜在解决方案,但没有解决任何具体问题 我试图将模型中的Author字段设置为“unique=True”,但这导致迁移时出现数据库错误 如有任何见解,将不胜感激: 型号: class Story(models.Mode

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

到目前为止,它有一个警告:当显示表单时,用户(“作者”)将看到一个所有用户的下拉列表,而不是自动用用户名填充该字段。这显然是不能接受的

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

我试图将模型中的Author字段设置为“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)
表格:

视图:


编辑:我想我找到了一个相对简单的答案:我只是从表单中删除了“author”字段,并保持了相同的视图。我可以用这种方式在注册用户的名字下发布。我认为这是可行的,除非我不知道(很多)有什么不正确或不好的协议。

我设法做了类似的事情:

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

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)
与用户关联的所有表单的基类:

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)
            ....

我还更改了我的初始代码。

有趣的解决方案。下拉菜单公开所有用户是否也有同样的问题?这就结束了它?此外,保存表单时进行编辑是必要的还是更适合直接使用从模型创建的表单?您会得到下拉选择菜单,因为它是t的默认小部件他输入了ForeignKey字段,是的,我也有。我不想在表单中输入用户名,因为用户很清楚他的名字,所以我的代码将其从表单中删除(用于显示)不,这不是必需的,但在表单对象本身中更面向对象。非常好。使用您的方法,它会自动将注册用户名填充到用户字段?如果是这样,那就接近完美了。嗯,几乎所有您需要做的就是用附加的用户参数构建表单,如:StoryForm(data=request.POST,user=request.user)或StoryForm(user=request.user)。哦,为了清楚起见,忘记了一些东西。您的基本用户模型是一个新的独立模型,对吗?表单模型也是这样?我的示例中的StoryForm将使用:StoryForm(UserOwnedModel):,或者类似的东西?