2010-11-16 8 views
1
class A(models.Model): 
    foreign = models.ForeignKey(B, unique=True) 

J'ai le code ci-dessus - comment puis-je m'assurer que dans la liste déroulante sous A Admin, pour 'étranger', je ne suis présenté qu'avec des choix uniques? C'est juste pour empêcher un utilisateur de violer la contrainte d'unicité et de présenter le message d'erreur d'administration.Comment restreindre dropdown dans Django administrateur

Répondre

0

Veuillez regarder ModelAdmin.formfield_for_foreignkey() here. L'inconvénient est d'avoir recours à raw SQL.

class AModelAdmin(admin.ModelAdmin): 
def formfield_for_foreignkey(self, db_field, request, **kwargs): 
    if db_field.name == "foreign": 
     kwargs["queryset"] = B.objects.raw('SELECT * FROM myapp_a where not exists (select id from myapp_b where b.id=a.foreign_id') 
    return super(AModelAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs) 

à mon humble avis « non-nuls non-blanc unique » FKs ressemble à une bonne occasion de repenser votre modélisation - peut être la fusion de deux modèles. Chaque fois que je me suis retrouvé à lutter trop durement dans Django, j'essayais de faire quelque chose de naïf.

+0

Malheureusement, cela ne fonctionne pas, car le modèle d'administration n'est pas rendu correctement - J'obtiens: "Caught AttributeError lors du rendu: l'objet 'RawQuerySet' n'a aucun attribut 'all'" – cockadoodledo

+0

Si vous ouvrez un bogue sur http: // code.djangoproject.com/ Je peux envoyer un correctif pour ajouter une méthode factice() à RawQuerySet. –

+0

Vous pouvez aussi essayer: kwargs ["queryset"] .all = kwargs ["queryset"] .__ iter__ –