Автоматический автор в админке Django - PullRequest
5 голосов
/ 23 сентября 2010

все. Я работаю над админом для моего сайта django, и я столкнулся с препятствием.

У меня есть модель Entry и модель Related. Модель Related имеет два поля внешнего ключа: одно для модели Entry (entry) и одно для модели User Джанго (author). Модель Related считается «подмоделью» модели Entry, и у каждого пользователя может быть только один Related на Entry.

В админке Related редактируется встроенным с Entry. Как я понял, администратор показывает только один дополнительный Related за раз, и он автоматически заполняет поле author текущим пользователем:

from django.contrib import models
from django.contrib.auth.models import User

class Entry(models.Model):
    pass

class Related(models.Model):
    entry = models.ForeignKey(Entry)
    author = models.ForeignKey(User)
    class Meta:
        unique_together = ('entry', 'author')




from django.contrib import admin

class RelatedInline(admin.StackedInline):
    model = Related
    exclude = ('author',)
    max_num = 1

class EntryAdmin(admin.ModelAdmin):
    inlines = (RelatedInline,)
    def save_formset(self, request, form, formset, change):
        instances = formset.save(commit=False)
        for instance in filter(lambda obj: isinstance(obj, Related), instances):
             if instance.__dict__.get('author', None) is None:
                 instance.author = request.user
                 instance.save()
        formset.save_m2m()

Проблема в том, что если пользователь хочет отредактировать запись, которая уже имеет Related от любого , то будет отображаться только одно связанное поле.

Если возможно, мне интересно, есть ли у кого-нибудь идеи о том, как я могу сохранить настройки, подобные этой, но попросить администратора автоматически отобразить related пользователя, если он существует, и пустую форму, если ее нет. За исключением этого, я просто избавился бы от строки max_num = 1 и заменил бы ее на extra = 1. Конечно, это будет означать, что «новая связанная» форма будет отображаться, даже если у пользователя уже есть такая форма для текущей записи, поэтому мне интересно, есть ли у кого-нибудь представление о том, как я мог бы поймать возможный IntegrityError и сообщить пользователю об этом? что произошла ошибка.

1 Ответ

0 голосов
/ 28 сентября 2011

Оказывается, это довольно просто.Вам просто нужно добавить функцию queryset к вашему классу RelatedInline, указав, какой встроенный элемент отображать.Если возвращенный набор запросов имеет хотя бы один элемент, будет показан первый.Если набор запросов пуст, будет показан один пустой встроенный текст!

class RelatedInline(admin.StackedInline):
    model = Related
    exclude = ('author',)
    max_num = 1

    def queryset(request):
        return Related.objects.filter(author = request.user)
...