Ich erstelle eine Django-App, bei der jede Site eine einzelne Kategorie enthält, die aus einer Reihe möglicher Kategorien ausgewählt wird. Also habe ich zwei Modelle: Site
und Category
.ModelForm zeigt ForeignKey-Tabellenwerte an, keine Auswahl
Ich möchte eine viele-zu-eins-Beziehung zwischen den Site
und Category
Modelle. Die Tabelle Category
enthält eine Auswahl verschiedener Kategorien, und jeder Datensatz Site
verfügt über einen Fremdschlüssel, der auf eine dieser Kategorien verweist.
models.py:
from django.db import models
from django.utils.encoding import python_2_unicode_compatible
@python_2_unicode_compatible # for python 2 support
class Site(models.Model):
Category = models.ForeignKey('Category')
def __str__(self):
return self.Name
CATEGORY_CHOICES = (
('AU', 'Automobiles'),
('BE', 'Beauty Products'),
('GR', 'Groceries'),
)
class Category(models.Model):
Category = models.CharField(choices=CATEGORY_CHOICES,max_length=2)
def __str__(self):
return '%s' % (self.Category)
forms.py:
from django.forms import ModelForm
from sites.models import Site
class NewSiteForm(ModelForm):
class Meta:
model = Site
fields = ['Category']
newsite.html:
<!DOCTYPE html>
<form method="post" action="">
{{ form}}
</form>
Newsite.html gibt mir eine Kategorie, die Drop-Down-gespeicherten Werte bereits auflistet in meiner Category-Datenbank, anstatt den Inhalt der im Category-Modell definierten Auswahltupel aufzulisten. so erhalte ich diese:
<!DOCTYPE html>
<form method="post" action="">
<tr><th><label for="id_Category">Category:</label></th><td><select id="id_Category" name="Category">
<option value="" selected="selected">---------</option>
<option value="1">AU</option>
<option value="2">BA</option>
<option value="3">BE</option>
<option value="4">BO</option>
<option value="5">PH</option>
<option value="6">CO</option>
<option value="7">CC</option>
<option value="8">CB</option>
<option value="9">CE</option>
<option value="10">CS</option>
<option value="11">CA</option>
<option value="12">EA</option>
<option value="13">EC</option>
<option value="14">FA</option>
<option value="15">GR</option>
<option value="16">HA</option>
<option value="17">HE</option>
<option value="18">HG</option>
<option value="19">IN</option>
<option value="20">JE</option>
<option value="21">LT</option>
<option value="22">MS</option>
<option value="23">MU</option>
<option value="24">MI</option>
<option value="25">OF</option>
<option value="26">OU</option>
<option value="27">PC</option>
<option value="28">SH</option>
<option value="29">SO</option>
<option value="30">SP</option>
<option value="31">TO</option>
<option value="32">TY</option>
<option value="33">DV</option>
<option value="34">CL</option>
<option value="35">WA</option>
<option value="36">WI</option>
</select></td></tr>
</form>
Ich möchte das Formular nur die im Modell definierten drei Auswahlmöglichkeiten angezeigt werden, anstatt die Inhalte der Datenbank, wie folgt aus:
<!DOCTYPE html>
<form method="post" action="">
<tr><th><label for="id_Category">Category:</label></th><td><select id="id_Category" name="Category">
<option value="" selected="selected">---------</option>
<option value="AU">Auto</option>
<option value="BE">Beauty Products</option>
<option value="GR">Groceries</option>
</select></td></tr>
</form>
Was bin ich verstehe hier nicht und wie mache ich das?
(Beachten Sie, dass es in CATEGORY_CHOICES
ein Tupel gibt, das eine lesbare Wahl für jeden aus zwei Buchstaben bestehenden Eintrag in der Category
Tabelle bietet, aber ich spare Platz, indem ich nicht alle in dieser Frage aufliste).
Danke, das funktioniert - aber der Grund für die Angabe von 'Site' war, dass ich ModelForm verwenden wollte, um alle Felder für das' Site' Modell hinzuzufügen. Wenn ich stattdessen 'Category' angeben, möchte ich das nicht tun, und die ModelForm scheint mir nicht zwei Modelle auf einmal angeben zu lassen. Wie kann ich dies zu einem ModelForm für die "Site" -Felder machen und gleichzeitig 'CATEGORY_CHOICES' für das' Category'-Feld erlauben? – RubyNoob