все. Я работаю над админом для моего сайта 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
и сообщить пользователю об этом? что произошла ошибка.