django - 覆盖管理员中的 save_form 对于内联管理员不起作用

标签 django django-models django-admin django-forms

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

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

我有以下文件:

模型.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')

表单.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)

谢谢!

最佳答案

您应该尝试以下操作!我在那里放置了一个 try... except block ,因为页面上可能还有其他没有 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

关于django - 覆盖管理员中的 save_form 对于内联管理员不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4153690/

相关文章:

django - 如何为 Django Admin 创建复杂的 Django 模型验证?

django - 多个注释和项产生夸张的答案

python - 获取今天日期位于表中两个日期之间的对象

Django模型表单同时保存两次发布请求

sql-server - 使用 MyModel.objects.raw() 基于 SQL 表值函数的 Django 模型

python - 在 django 中组织关系的最佳方式是什么?平坦的还是树状的?

django - 列出链接到模型的外键

django - 直接从 memcache 返回内容 - Django/HTTP 服务器

python - 单独文件中的 Django html 模板

python - Django 管理不显示条目