2010-09-23 27 views
5

wszystko. Pracuję nad administratorem mojej witryny django i natknąłem się na przeszkodę.Automatyczny autor w Django admin

Mam model Entry i model Related. Model Related ma dwa obce pola klucza: jeden do modelu Entry (entry) i jeden do modelu django User (author). Model Related jest uważany za "podmodel" modelu Entry, a każdy użytkownik może mieć tylko jeden Related na Entry.

W administratorze, Related jest edytowany inline z Entry. Jak mam go, administrator przedstawia tylko jeden dodatkowy Related naraz i automatycznie wypełnia pola author z bieżącego użytkownika:

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() 

Problem polega na tym, że jeśli użytkownik chce edytować wpis, który ma już a Related przez dowolne, wtedy tylko to powiązane pole zostanie pokazane.

Jeśli to możliwe, zastanawiam się, czy ktoś ma jakieś pomysły na temat tego, w jaki sposób mogę utrzymać konfigurację podobną do tej, ale niech administrator automatycznie wyświetli jego użytkownika related, jeśli istnieje, a pusty formularz, jeśli nie. Poza tym, po prostu pozbyłbym się linii max_num = 1 i zastąpiłbym ją extra = 1. Oczywiście oznaczałoby to, że "nowa, powiązana" forma byłaby widoczna, nawet jeśli użytkownik już ją miał dla bieżącego wpisu, więc zastanawiam się, czy ktoś ma jakieś pojęcie o tym, jak złapię możliwą IntegrityError i niech użytkownik wie, że wystąpił błąd.

+1

Duplikat http://stackoverflow.com/questions/2101979/django-admin-filter-objects-for-inline-formset –

+0

Nie jestem pewien, że jest. – Dave

Odpowiedz

0

Okazuje się, że jest to całkiem proste. Trzeba tylko dodać funkcję queryset do klasy RelatedInline, określając, które wbudowane do wyświetlenia. Jeśli zwrócony zestaw zapytań ma co najmniej jeden element, pierwszy zostanie wyświetlony. Jeśli zestaw zapytań jest pusty, zostanie wyświetlony pojedynczy pusty wiersz!

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

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