【问题标题】:Assign username to field in models.py table将用户名分配给 models.py 表中的字段
【发布时间】:2021-08-17 12:34:48
【问题描述】:

假设我有一个包含 5 个数据的 Table1,

> 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) 值。

请问我该如何解决?

【问题讨论】:

  • 分享相关观点。

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


【解决方案1】:

我建议使用 ForeignKey 来引用 autohr,此外,使用 auto_now_add 来访问 post_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

UpdateView,我们现在可以更新用户模型:

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

class MyUpdateView(LoginRequiredMixin, UpdateView):
    model = Table1
    form = Table1_F

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

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)

注意:通常使用settings.AUTH_USER_MODEL [Django-doc] 引用用户模型比直接使用User model [Django-doc] 更好。更多信息可以查看referencing the User model section of the documentation

【讨论】:

  • 最好在 ModelForm 而不是视图上执行此操作?如果您有其他视图使用相同的表单,则每次都必须手动执行。
  • @MarcCompte: 通常表单是不知道请求的,虽然您当然可以覆盖ModelForm 逻辑以使用请求对象(或用户对象),但我不确定这是否好想法,因为它使表单请求感知,并且可重复使用较少,例如用于计划任务。
  • 我明白你的意思。我想这取决于每个人的设置和您使用的功能。我仍然希望对表单进行一些检查,看看是否需要覆盖用户字段。但是如果你只有一个视图使用这个表单,这也是合适的。
  • 您好,我只想在models.py 中添加一个函数来计算最后一次更新前的天数,但是我有一些问题? def get_date(self): today = datetime.datetime.date() days = self.date_Up daysDiff = (today-days) return daysDiff
  • @tibas: 啊,那你需要在文件头部from django.utils.timezone import now,在表达式中使用(now()-self.date_Up).days
猜你喜欢
  • 1970-01-01
  • 2017-03-10
  • 1970-01-01
  • 2019-10-11
  • 2022-08-09
  • 2020-02-01
  • 2021-01-19
  • 2015-12-05
  • 2015-08-01
相关资源
最近更新 更多