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
我写了一个由 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