переопределение save_form в Admin не работает для inline'd Admin - PullRequest
4 голосов
/ 11 ноября 2010

Я переопределяю save_form для автоматического заполнения поля автора в классе Grievances, используя obj.author = request user.Работает отлично.Но затем, для целей inline, я пытаюсь сделать то же самое, используя obj.status_author = request.user.Не работает - ничего не вводится, и выполнение sql завершается неудачно, так как status_author является обязательным полем.

Успешное переопределение save_form происходит в моем GrievancesAdmin для obj.author.Если я попробую то же самое для 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)

Спасибо!

Ответы [ 2 ]

2 голосов
/ 11 ноября 2010

Вы должны попробовать что-то вроде следующего!Я поставил здесь попытку ... кроме блока, потому что на странице могут быть и другие формы, которые не имеют атрибута 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
0 голосов
/ 11 ноября 2010

Для встроенного администратора вы, вероятно, хотите переопределить save_formset вместо.

...