2012-02-17 6 views
5

È possibile utilizzare qualcosa di simile agli elementi relazionali in linea dall'amministratore di Django per rappresentare i modelli incorporati in un ListField?Implementazione di un inline per rappresentare un ListField in Django-nonrel

Per esempio, ho i seguenti modelli:

class CartEntry(model.Model): 
    product_name=model.CharField(max_length=20) 
    quantity = model.IntegerField() 

class Cart(model.Model): 
    line_items = ListField(EmbeddedModelField('CartEntry')) 

Ho provato con la messa in linea standard, ma io so che non è giusto:

class CartEntryInline(admin.StackedInline): 
    model=CartEntry 

class CartAdmin(admin.ModelAdmin) 
    inlines=[CartEntryInline] 

Ma, ovviamente, che doesn' lavoro, dal momento che non esiste una relazione di chiave straniera. C'è un modo per farlo in django-nonrel?

risposta

0

Questo non è così facile da fare fuori dalla scatola. Dovrai gestire i campi di tipo ListField e EmbeddedModelField nel modulo di amministrazione di Django e fare un po 'di hacking per farlo. Dovrete implementare due parti:

Use EmbeddedModelField in Django's admin

è necessario definire una classe che gestisce gli oggetti EmbeddedModelField per farlo funzionare con Admin di Django. Here è un link in cui puoi trovare ottimi codici di esempio. Qui di seguito sono blocchi di codice solo per la dimostrazione:

Aggiungere questa classe nel file models.py e utilizzare EmbedOverrideField invece di EmbeddedModelField in Cart modello:

class EmbedOverrideField(EmbeddedModelField): 
    def formfield(self, **kwargs): 
     return models.Field.formfield(self, ObjectListField, **kwargs) 

implementare una classe in forms.py che ha due metodi:

class ObjectListField(forms.CharField): 
    def prepare_value(self, value): 
     pass # you should actually implement this method 

    def to_python(self, value): 
     pass # Implement this method as well 

Use ListFields in Django's admin

È inoltre necessario definire una classe che gestisca gli oggetti ListField per farlo funzionare con l'amministratore di Django. Here è un link in cui puoi trovare ottimi codici di esempio. Qui di seguito sono blocchi di codice solo per la dimostrazione:

Aggiungere questa classe nel file models.py e ItemsField invece di ListField in Cart modello:

class ItemsField(ListField): 
    def formfield(self, **kwargs): 
     return models.Field.formfield(self, StringListField, **kwargs) 

Implementare una classe in forms.py che ha due metodi:

class StringListField(forms.CharField): 
    def prepare_value(self, value): 
     pass # you should actually implement this method 

    def to_python(self, value): 
     pass # Implement this method as well