2013-07-30 38 views
53

Mam zarejestrowany model na stronie administratora. Jednym z jego pól jest długi ciąg znaków. Chciałbym dodać niestandardowe pola formularza do strony dodawania/aktualizacji tego modelu w administratorze, które na podstawie tych pól wartości Zbuduję długie wyrażenie tekstowe i zapiszę je w odpowiednim polu modelu.Administrator django - dodaj niestandardowe pola formularza, które nie są częścią modelu

Jak mogę to zrobić?

AKTUALIZACJA: Zasadniczo robię budowanie wyrażeń matematycznych lub ciągów znaków z symboli, użytkownik wybiera symbole (są to pola niestandardowe, które nie są częścią modelu) i gdy kliknie przycisk Zapisz, utworzę Wyrażanie ciągów reprezentacja z listy symboli i przechowywać go w DB. Nie chcę, aby symbole były częścią modelu i DB, a jedynie wyrażenie końcowe.

Odpowiedz

20

Można to zrobić w administracji, ale nie jest to bardzo proste. Chciałbym również doradzić, aby zachować większość logiki biznesowej w swoich modelach, więc nie będziesz zależny od Administratora Django.

Może byłoby łatwiej (a może nawet lepiej), jeśli masz dwa oddzielne pola w swoim modelu. Następnie dodaj metodę na swoim modelu, która je łączy.

Na przykład:

class MyModel(models.model): 

    field1 = models.CharField(max_length=10) 
    field2 = models.CharField(max_length=10) 

    def combined_fields(self): 
     return '{} {}'.format(self.field1, self.field2) 

Następnie w panelu administracyjnym można dodać combined_fields() jako tylko do odczytu pola:

class MyModelAdmin(models.ModelAdmin): 

    list_display = ('field1', 'field2', 'combined_fields') 
    readonly_fields = ('combined_fields',) 

    def combined_fields(self, obj): 
     return obj.combined_fields() 

Jeśli chcesz zapisać combined_fields w bazie danych można również zapisać go po zapisaniu modelu:

def save(self, *args, **kwargs): 
    self.field3 = self.combined_fields() 
    super(MyModel, self).save(*args, **kwargs) 
+2

Dzięki za odpowiedź, ale to nie jest to, co ja szukam. Nie chcę, aby pola niestandardowe były zapisywane w DB, tylko obliczony ciąg. Zasadniczo robię budowanie wyrażeń matematycznych lub ciągów znaków z symboli, użytkownik wybiera symbole (są to pola niestandardowe, które nie są częścią modelu), a kiedy kliknie zapisz, utworzę reprezentację wyrażenia ciągu z listy symbole i przechowuj je w DB. – michalv82

+0

@ michalv82 Możesz również zapisać go w bazie danych w metodzie 'save()' modelu, sprawdź aktualizacje mojej odpowiedzi. – rednaw

+0

Jeszcze raz dziękuję, ale problem polega na tym, że nie chcę przechowywać pól, które łączą ostatnie pole (tj. Symbole), chcę tylko zapisać końcowy ciąg znaków. – michalv82

3

Jeśli absolutnie y chcą przechowywać pole łączyć na modelu a nie dwóch pól indywidualne, mógłby zrobić coś takiego:

nigdy zrobić coś takiego, więc nie jestem całkowicie pewien, jak to będzie działać na zewnątrz.

101

W formularzu admin.py lub w oddzielnym formularzu możesz dodać klasę ModelForm, a następnie zadeklarować dodatkowe pola wewnątrz niej tak, jak zwykle. Ja również podano przykład, jak można użyć tych wartości w form.save():

class YourModelForm(forms.ModelForm): 

    extra_field = forms.CharField() 

    def save(self, commit=True): 
     extra_field = self.cleaned_data.get('extra_field', None) 
     # ...do something with extra_field here... 
     return super(YourModelForm, self).save(commit=commit) 

    class Meta: 
     model = YourModel 

Aby mieć dodatkowe pola występujące w admin tylko:

  1. edytuj administrator.py i ustawić właściwość formularz odnieść się do utworzonego powyżej postaci
  2. zawierać nowych pól w pola lub fieldsets deklaracji

tak:

class YourModelAdmin(admin.ModelAdmin): 

    form = YourModelForm 

    fieldsets = (
     (None, { 
      'fields': ('name', 'description', 'extra_field',), 
     }), 
    ) 

UPDATE: w Django 1.8 ty trzeba dodać fields = '__all__' do metaklasy YourModelForm.

+4

Czy istnieje powód, dla którego ta odpowiedź nie została przyjęta? – sthzg

+2

Tak, naprawdę chcę znać powód – Vishnu

+8

Powinieneś dodać 'fields = '__all __'' w swojej klasie 'Meta', inaczej django narzeka:' Tworzenie ModelForm bez atrybutu 'fields' lub 'exclude' jest przestarzałe ' – IsaacKleiner

4

zawsze można utworzyć nowy szablon administracyjny, a nie to, czego potrzebujesz w swoim admin_view (nadpisać admin dodaj link do admin_view):

url(r'^admin/mymodel/mymodel/add/$' , 'admin_views.add_my_special_model') 
Powiązane problemy