Django 将用户名分配给models.py表中的字段

Django 将用户名分配给models.py表中的字段,django,authentication,django-models,django-views,django-forms,Django,Authentication,Django Models,Django Views,Django Forms,假设我有一个包含5个数据的表1 > class Table1(models.Model): > code = models.CharField(max_length=16,unique=True) > > author_Up = models.CharField(max_length=16,default=User) > date_Up = models.DateTimeField(auto_now=True) &g

假设我有一个包含5个数据的表1

> class Table1(models.Model):
>     code     = models.CharField(max_length=16,unique=True)
> 
>     author_Up    = models.CharField(max_length=16,default=User)
>     date_Up      = models.DateTimeField(auto_now=True)
>     post_date    = models.DateTimeField(default=timezone.now)
>     author       = models.ForeignKey(User,on_delete=models.CASCADE)
>     def __str__(self):
>         return self.code
我使用formes.py作为:

class Table1_F(forms.ModelForm):
    code = forms.CharField(label='Code',max_length=16)
    class Meta:
        model= Table1
        fields=['code']
问题是每次其他用户进行更新并保留初始作者时,我都需要分配一个新值(author_Up)和(date_Up)


我该如何解决这个问题?

我建议使用
外键
来参考autohr,并进一步使用
auto\u now\u add
来添加
post\u date
字段:

from django.conf import settings

class Table1(models.Model):
    code = models.CharField(max_length=16,unique=True)
    author_Up = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        related_name='updated_posts',
        on_delete=models.CASCADE
    )
    date_Up = models.DateTimeField(auto_now=True)
    post_date = models.DateTimeField(auto_now_add=True)
    author = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        related_name='written_posts',
        on_delete=models.CASCADE
    )
    
    def __str__(self):
        return self.code
CreateView
中,我们可以设置
author
,必要时设置
authorUp

from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic import CreateView

class MyUpdateView(LoginRequiredMixin, CreateView):
    model = Table1
    form = Table1_F  # might be another form

    def form_valid(self, form):
        form.instance.author_Up = self.request.user
        form.instance.author = self.request.user
        return super().form_valid(form)
来自django.contrib.auth.mixins导入登录所需的mixin
从django.views.generic导入CreateView
类MyUpdateView(LoginRequiredMixin,CreateView):
模型=表1
form=Table1_F#可能是另一种形式
def表单_有效(自身、表单):
form.instance.author\u Up=self.request.user
form.instance.author=self.request.user
return super().form\u有效(form)

注意:通常最好使用来引用用户模型,而不是直接使用。有关更多信息,请参见


共享相关视图。在ModelForm而不是视图上执行此操作不是最好的吗?如果有其他视图使用同一表单,则每次都必须手动执行。@MarCompte:通常表单不知道请求,虽然您当然可以覆盖
ModelForm
逻辑以使用请求对象(或用户对象),但我不确定这是否是一个好主意,因为它使表单请求知道,例如,在计划任务中使用它会减少可重用性。我明白你的意思。我想这取决于每个人的设置和你使用的功能。我仍然希望对表单进行一些检查,看看是否需要覆盖用户字段。但是,如果您只有一个使用此表单的视图,这也很合适。您好,我只想在models.py中添加一个函数来计算最后一次更新前的天数,但是我有一些问题吗?def get_date(self):今天=datetime.datetime.date()天=self.date_Up daysDiff=(今天天)返回daysDiff@tibas:啊,那么您需要在文件头中从django.utils.timezone立即导入
,并在表达式中使用
(now()-self.date\u Up).days
from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic import CreateView

class MyUpdateView(LoginRequiredMixin, CreateView):
    model = Table1
    form = Table1_F  # might be another form

    def form_valid(self, form):
        form.instance.author_Up = self.request.user
        form.instance.author = self.request.user
        return super().form_valid(form)