在管理员中覆盖 save_form 对于内联管理员不起作用
我使用 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
你应该尝试下面的方法!我在那里放置了一个 try... except 块,因为页面上可能还有其他表单,但没有
status_author
属性!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!对于内联管理,您可能需要重写
save_formset
。For an inline admin, you probably want to override
save_formset
instead.