2010-09-23 12 views
5

alle. Ich arbeite am Admin für meine Django-Site und bin auf ein Hindernis gestoßen.Automatischer Autor in Django Admin

Ich habe ein Entry Modell und ein Related Modell. Das Related Modell hat zwei Fremdschlüsselfelder: eins zum Modell Entry (entry) und eins zu Djangos User Modell (author). Das Modell Related wird als "Untermodell" des Modells Entry angesehen, und jeder Benutzer kann nur ein Related pro Entry haben.

Im Admin wird Related inline bearbeitet mit Entry. Wie ich es habe, zeigt der Administrator nur eine zusätzliches Related zu einer Zeit, und es füllt automatisch das author Feld mit dem aktuellen Benutzer:

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

Das Problem ist, dass, wenn ein Benutzer einen Eintrag bearbeiten, die bereits a Related von jemand, dann wird nur das eine verwandte Feld angezeigt.

Wenn möglich, frage ich mich, ob jemand irgendwelche Ideen hat, wie ich ein Setup ähnlich halten könnte, aber der Admin automatisch die related des Benutzers anzeigt, wenn es existiert und ein leeres Formular, wenn es nicht ist. Abgesehen davon würde ich nur die Linie max_num = 1 loswerden und sie durch extra = 1 ersetzen. Natürlich würde dies bedeuten, dass ein "neues verwandtes" Formular auch dann angezeigt würde, wenn der Benutzer bereits einen für den aktuellen Eintrag hatte, also frage ich mich, ob jemand eine Ahnung hat, wie ich einen möglichen IntegrityError fangen und den Benutzer wissen lassen könnte Fehler ist aufgetreten.

+1

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

+0

Ich bin nicht sicher, ob es ist. – Dave

Antwort

0

Es stellt sich heraus, das ist ziemlich einfach. Sie müssen lediglich eine queryset-Funktion zu Ihrer RelatedInline-Klasse hinzufügen und angeben, welche Inline angezeigt werden soll. Wenn das zurückgegebene Abfrage-Set mindestens ein Mitglied hat, wird das erste angezeigt. Wenn das Abfrage-Set leer ist, wird ein einzelnes Leerzeichen inline angezeigt!

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

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