2010-09-23 26 views
5

todos. Estoy trabajando en el administrador de mi sitio django, y me encontré con un obstáculo.Autor automático en Django admin

Tengo un modelo Entry y un modelo Related. El modelo Related tiene dos campos clave externos: uno para el modelo Entry (entry) y uno para el modelo User de django (author). El modelo Related se considera un "submodelo" del modelo Entry, y cada usuario solo puede tener uno Related por Entry.

En el administrador, Related se edita en línea con Entry. Como lo tengo, el administrador muestra sólo una extra Related a la vez, y se llena automáticamente el campo author con el usuario actual:

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

El problema es que si un usuario quiere editar una entrada que ya tiene a Related por cualquiera, entonces solo se mostrará ese campo relacionado.

Si es posible, me pregunto si alguien tiene alguna idea sobre cómo puedo mantener una configuración similar a esta, pero que el administrador muestre automáticamente el related del usuario si existe y un formulario vacío si no es así. Salvo eso, me gustaría deshacerme de la línea max_num = 1 y reemplazarla por extra = 1. Por supuesto, esto significaría que se mostraría un formulario "nuevo relacionado" incluso si el usuario ya tenía uno para la entrada actual, por lo que me pregunto si alguien tiene alguna idea sobre cómo captaría un posible IntegrityError y le haré saber al usuario que error había ocurrido.

+1

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

+0

no estoy seguro de lo que es. – Dave

Respuesta

0

Resulta que esto es bastante simple. Solo necesita agregar una función queryset a su clase RelatedInline, especificando qué línea mostrar. Si el conjunto de preguntas devuelto tiene al menos un miembro, se mostrará el primero. Si el conjunto de preguntas está vacío, se mostrará una línea en blanco.

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

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