2010-03-31 3 views
10

Sagen wir, ich bin mit dem Django-Site-Modell:Wie konstruiere ich ein Django-Formular mit Modellobjekten in einem Select-Widget?

class Site(models.Model): 
    name = models.CharField(max_length=50) 

sind Meine Website-Werte (Schlüssel, Wert):

1. Stackoverflow 
2. Serverfault 
3. Superuser 

ich mit der ein Formular mit einer HTML-select-Widget erstellen möchten über Werte:

<select> 
    <option value="1">Stackoverflow</option> 
    <option value="2">Serverfault</option> 
    <option value="3">Superuser</option> 
</select> 

ich denke, mit dem folgenden Code zu starten, aber es ist unvollständig:

class SiteForm(forms.Form): 
    site = forms.IntegerField(widget=forms.Select()) 

Irgendwelche Ideen, wie ich das mit Django Form erreichen kann?

EDIT

Verschiedene Seiten haben unterschiedliche Website Werte präsentieren. Eine Dev-Seite zeigt Entwicklungsseiten an, während eine Kochseite Rezept-Sites anzeigt. Ich möchte die Widget-Optionen basierend auf der Ansicht im Grunde dynamisch füllen. Ich glaube, dass ich das im Moment erreichen kann, indem ich den HTML-Code manuell in der Vorlage erzeuge.

Antwort

11

Ich denke, Sie suchen nach ModelChoiceField.

UPDATE: Beachten Sie vor allem das Argument queryset. In der Ansicht, die die Seite unterstützt, können Sie die von Ihnen angegebene QuerySet basierend auf den Kriterien ändern, die Ihnen wichtig sind.

+0

Kann ich das Abfrage-Set in der Ansicht angeben? –

+0

Wie in, bieten die 'QuerySet' zu verwenden, wann immer Sie Ihre' Form' instanziieren? Ich bin mir nicht sicher. Wenn Ihre Möglichkeiten begrenzt sind, scheint es ziemlich einfach zu sein, eine 'Form'-Unterklasse bereitzustellen, die auf die von Ihnen verwendete Ansicht zugeschnitten ist, zB' DeveloperSitesForm', 'EndUserSitesForm', usw. –

+1

Ich konnte das aus dem Code heraus machen diese Frage: http://stackoverflow.com/questions/622982/django-passing-custom-form-parameter-to-formset –

10

ich nicht getestet haben, aber ich bin etwas entlang der Linien des Denkens ...

site = forms.IntegerField(
    widget=forms.Select(
     choices=Site.objects.all().values_list('id', 'name') 
     ) 
    ) 

Bearbeiten -

ich das gerade ausprobiert und es die Entscheidungen richtig generiert . Das choices Argument erwartet eine Liste von 2-Tupeln so ...

(
    (1, 'stackoverflow'), 
    (2, 'superuser'), 
    (value, name), 
) 

The .values_list zurückkehren, dass genaue Format zur Verfügung gestellt Sie die ID haben und den Namen/Titel/was auch immer als so: .values_list('id', 'name'). Wenn das Formular gespeichert wird, ist der Wert .site die ID/PK der ausgewählten Site.

+0

Dies wird den Site-Abfrage-Satz auswerten, wenn das Formular zum ersten Mal definiert wird. Wenn sich die Daten ändern, zeigt das Formular die neuen Daten nicht an. –

Verwandte Themen