在管理员中覆盖 save_form 对于内联管理员不起作用

发布于 2024-10-01 09:04:51 字数 2509 浏览 1 评论 0原文

我使用 obj.author = request user 重写 save_form 以自动填充类 Grievances 中的作者字段。效果很好。但是,出于内联的目的,我使用 obj.status_author = request.user 尝试同样的事情。不起作用 - 未输入任何内容,并且 sql 执行失败,因为 status_author 是必填字段。

save_form 的成功覆盖发生在我的 obj.author 的 GrievancesAdmin 中。如果我对 obj.status_author 尝试同样的操作,但在 GrievanceStatusAdmin (内联)中,它不会在输入中不起作用。

我有以下文件:

models.py

class Grievances(models.Model):
    title = models.CharField(max_length=90)
    author = models.ForeignKey(User, related_name='grievance_author')
    firefighter = models.ForeignKey(User, related_name='firefighter_harmed')
    ...

class GrievanceStatus(models.Model):
    title = models.ForeignKey(Grievances)
    updatetext = models.TextField(blank=True)
    action = models.CharField(max_length=20)
    status_author = models.ForeignKey(User, related_name='grievance_status_author')

forms.py

class UserModelChoiceField(forms.ModelChoiceField):
    """ Override to use full name in ChoiceField """
    def label_from_instance(self, obj):
        return "%s (%s)" % (obj.get_full_name(), obj.username)

class GrievanceForm(forms.ModelForm):
    firefighter = UserModelChoiceField(User.objects.all().order_by('last_name')) 
    class Meta:
        model = Grievances

class GrievanceStatusForm(forms.ModelForm):
    class Meta:
        model = GrievanceStatus
        fields = ('action', 'updatetext', )

admin.py

class GrievanceStatusInline(admin.StackedInline):
    model = GrievanceStatus
    fk_name = 'title'
    form = GrievanceStatusForm
    list_select_related = True

class GrievancesAdmin(admin.ModelAdmin):
    list_display = ('title', 'firefighter',)
    inlines = [ GrievanceStatusInline ]
    form = GrievanceForm

    def save_formset(self, request, form, formset, change):
        ### something is wrong with the following line but i'm not sure what ###
        obj2 = super(GrievancesAdmin, self).save_formset(request, form, formset, change)
        obj2.status_author = request.user
        formset.save()

    def save_form(self, request, form, change):
        obj = super(GrievancesAdmin, self).save_form(request, form, change)
        obj.firefighter = User.objects.get(username__exact=obj.firefighter)
        obj.status_author = request.user
        if not change:
            obj.author = request.user
        obj.date_updated = datetime.datetime.now()
        return obj
admin.site.register(Grievances, GrievancesAdmin)

谢谢!

I override save_form to automatically populate the author field in class Grievances by using obj.author = request user. Works great. But then, for purposes of the inline, I try the same thing using obj.status_author = request.user. Doesn't work - nothing is input and the sql execution fails because status_author is a required field.

The successful overriding of save_form takes place in my GrievancesAdmin for obj.author. If I try the same thing for obj.status_author, but in GrievanceStatusAdmin (which gets inlined), it does not work as nothing in input.

I have the following files:

models.py

class Grievances(models.Model):
    title = models.CharField(max_length=90)
    author = models.ForeignKey(User, related_name='grievance_author')
    firefighter = models.ForeignKey(User, related_name='firefighter_harmed')
    ...

class GrievanceStatus(models.Model):
    title = models.ForeignKey(Grievances)
    updatetext = models.TextField(blank=True)
    action = models.CharField(max_length=20)
    status_author = models.ForeignKey(User, related_name='grievance_status_author')

forms.py

class UserModelChoiceField(forms.ModelChoiceField):
    """ Override to use full name in ChoiceField """
    def label_from_instance(self, obj):
        return "%s (%s)" % (obj.get_full_name(), obj.username)

class GrievanceForm(forms.ModelForm):
    firefighter = UserModelChoiceField(User.objects.all().order_by('last_name')) 
    class Meta:
        model = Grievances

class GrievanceStatusForm(forms.ModelForm):
    class Meta:
        model = GrievanceStatus
        fields = ('action', 'updatetext', )

admin.py

class GrievanceStatusInline(admin.StackedInline):
    model = GrievanceStatus
    fk_name = 'title'
    form = GrievanceStatusForm
    list_select_related = True

class GrievancesAdmin(admin.ModelAdmin):
    list_display = ('title', 'firefighter',)
    inlines = [ GrievanceStatusInline ]
    form = GrievanceForm

    def save_formset(self, request, form, formset, change):
        ### something is wrong with the following line but i'm not sure what ###
        obj2 = super(GrievancesAdmin, self).save_formset(request, form, formset, change)
        obj2.status_author = request.user
        formset.save()

    def save_form(self, request, form, change):
        obj = super(GrievancesAdmin, self).save_form(request, form, change)
        obj.firefighter = User.objects.get(username__exact=obj.firefighter)
        obj.status_author = request.user
        if not change:
            obj.author = request.user
        obj.date_updated = datetime.datetime.now()
        return obj
admin.site.register(Grievances, GrievancesAdmin)

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

夏尔 2024-10-08 09:04:51

你应该尝试下面的方法!我在那里放置了一个 try... except 块,因为页面上可能还有其他表单,但没有 status_author 属性!

class GrievancesAdmin(admin.ModelAdmin):

   def save_formset(self, request, form, formset, change):
       formset.save()
       if not change:
           for f in formset.forms:
               try:
                   obj = f.instance 
                   obj.status_author = request.user
                   obj.save()
                except:
                   continue

You should try something like the following! I put a try...except block there because you may have other forms on the page as well, that don't have a status_author attribute!

class GrievancesAdmin(admin.ModelAdmin):

   def save_formset(self, request, form, formset, change):
       formset.save()
       if not change:
           for f in formset.forms:
               try:
                   obj = f.instance 
                   obj.status_author = request.user
                   obj.save()
                except:
                   continue
陌生 2024-10-08 09:04:51

对于内联管理,您可能需要重写 save_formset

For an inline admin, you probably want to override save_formset instead.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文