Django admin - 如何添加 request.user 作为内联模型的默认值?

Django admin - How to add request.user as default vaule for a Inline model?

我写了一个由 2 个模型组成的小型支持应用程序,请参见下文。 当我在 django 管理面板上回答支持票时,我并不总是想为我添加到票中的每个回复手动设置作者姓名。相反,我希望 request.user 我自动将作者设置为初始值。遗憾的是,我无法在 django 文档中找到似乎可以解决此问题的任何解决方案 ...

admin.py

class SupportTicketRepliesInline(admin.TabularInline):
    model = SupportTicketReplies
    extra = 0
    min_num = 1

class SupportTicketsAdmin(admin.ModelAdmin):
    list_display = ['requester', 'creation_date', 'status', 'category', 'subject']
    ordering = ['-creation_date']
    list_filter = ['creation_date']
    inlines = [
        SupportTicketRepliesInline,
    ]


admin.site.register(SupportTickets, SupportTicketsAdmin)

models.py

...
class SupportTickets(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, unique=True)
    requester = models.ForeignKey(User, on_delete=models.CASCADE, null=False, blank=False)
    category = models.IntegerField(choices=TICKET_CATEGORY, verbose_name='Ticket Category')
    subject = models.CharField(max_length=30)
    description = models.TextField(max_length=2000, blank=False, verbose_name='Problem description')
    status = models.IntegerField(choices=STATUS_OF_TICKET, verbose_name='Ticket Status', default=2)
    creation_date = models.DateTimeField(auto_now_add=True, blank=False)

    def publish(self):
        self.creation_date = timezone.now()
        self.save()
    
    class Meta:
        verbose_name = "Support Ticket"
        verbose_name_plural = "Support Tickets"
        ordering = ['-creation_date']

models.py

class SupportTicketReplies(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    ticket = ForeignKey(SupportTickets, related_name='replies', on_delete=models.CASCADE)
    author = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='Author', blank=True)
    content = models.TextField(verbose_name="Content", max_length=2000)
    creation_date = models.DateTimeField(auto_now_add=True, blank=False)

    class Meta:
        verbose_name = "Ticket Reply"
        verbose_name_plural = "Ticket Replies"
        ordering = ['creation_date']

我想你需要的是: https://docs.djangoproject.com/en/3.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.formfield_for_foreignkey 它看起来像:

def formfield_for_foreignkey(self, db_field, request, **kwargs):
    if db_field.name == "author":
        self.fields['author'].queryset = UserModel.objects.filter(id=request.usermodel.id)

您还应该从模型中删除 blank=True。

或者您可以将 class 作为初始值添加到您的内联中:

 def __init__(self, *args, **kwargs):
     super().__init__(*args, **kwargs)
     self.fields['author'].initial = self.request.user

以下对我有用:

def formfield_for_foreignkey(self, db_field, request, **kwargs):
    if db_field.name == "author":
        author = request.user
        if author:
            kwargs['initial'] = author.pk
    return super(SupportTicketRepliesInline, self).formfield_for_foreignkey(db_field, request, **kwargs)

在 admin.TabularInline 或 admin.StackedInline