2016-08-27 1 views
1

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).

Antwort

1

Sie müssen Category Modell angeben:

class NewSiteForm(ModelForm): 
    class Meta: 
     model = Category # <-- 
     fields = ['Category'] 
+0

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

0

Meine Modellstruktur war schlecht. Es machte keinen Sinn, für das Modell Category separate Auswahlmöglichkeiten zu haben. Was hätte ich getan war:

1) entweder gelöscht nur das Category Modell zusammen und verwendet, um die CATEGORY_CHOICES direkt für das Category Feld im Site Modell, die Idee eines Fremdschlüssels zu verlassen.

2) Übertragen der menschenlesbaren Werte, die ich in CATEGORY_CHOICES gespeichert habe, in die Datenbankwerte für das Modell Category. und löschte die CATEGORY_CHOICES. Ich entschied mich schließlich dafür, weil es andere Felder geben wird, die mit Category, wie "genehmigt" verbunden sind. Es macht also immer noch Sinn, ein eigenes "Category" -Modell zu haben.