【问题标题】:custom form author - auto save author to DB自定义表单作者 - 自动将作者保存到数据库
【发布时间】:2011-09-15 08:43:44
【问题描述】:

我有一个自定义表单...我想自动保存表单数据的作者(经过身份验证的用户)。我正在使用 ModelForm 创建表单。

models.py

    class Tracker(models.Model):
        client = models.ForeignKey(Clients)
        user = models.ForeignKey(User)
        description = models.TextField()
...

我还将自定义配置文件链接到 django 用户表...而且身份验证工作正常...我可以读取用户和 id...

forms.py

class TrackerForm(ModelForm):
    def __init__(self, *args, **kwargs):
        super(TrackerForm, self).__init__(*args, **kwargs)
        self.fields.keyOrder = ['date_job_start','date_job_end','description','onsite','billable','client']
    class Meta:
        model = Tracker
        widgets = {
            'client': HiddenInput(),
        }

当从上层类创建表单并尝试保存它时...它需要用户数据(缺少警告)。如何更改它以便它自动保存经过身份验证的用户而不是要求它?我知道我没有在这里定义用户字段...那是因为我不想要它的下拉列表...我希望从身份验证中保存用户...没有任何选择或显示...

P.S.:我知道initial 选项...一定有更好的方法吗?

谢谢! BR

【问题讨论】:

    标签: django django-models django-forms django-authentication


    【解决方案1】:
    class TrackerForm(ModelForm):
        def __init__(self, *args, **kwargs):
            self.user = kwargs.pop('user')
            super(TrackerForm, self).__init__(*args, **kwargs)
            self.fields.keyOrder = ['date_job_start','date_job_end','description','onsite','billable','client']
    
        class Meta:
            model = Tracker
            widgets = {
            '    client': HiddenInput(),
            }
            exclude = ('user',)
    
        def save(self):
            obj = super(TrackerForm, self).save(commit=False)
            obj.user = self.user
            obj.save()
            return obj
    

    并且在视图中:

    form = TrackerForm(user=request.user) #and other parameters
    

    【讨论】:

    • 它有效...没有干燥器的方法吗?我有很多表格.​​..并且所有表格都必须指定用户...
    • 我对 django 有点陌生...我知道如何在模型中使用继承...但我不知道如何在此示例中使用它。
    • @Mission 这不是 django 特定的,只是通常的 python 继承。创建一个类(继承自ModelForm),它将在其构造函数中设置self.user,并在save() 方法中为obj 设置此用户。并将exclude = ('user',) 添加到其Meta。然后从这个类继承所有需要用户的表单。我没有时间测试它,但它会以这种方式工作。
    • 如何在上面的示例中使用户参数可选?如果我正在创建模型对象的新实例,我只需要设置。如果我正在使用模型表单编辑现有对象,则用户已经为我设置好了,我不需要传递给构造函数。
    • @James self.user = kwargs.pop('user', None) 并在保存前检查 self.instance 是否为 True
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多