2016-10-28 14 views
0

こんにちは私はDjangoで作業しています。私は人とチームを登録するための小さなシステムを作ろうとしています。Django:外部キーでフォームを作成する方法

これまでのところ、私は管理サイトにチームと人を作ることができます。

今、トレーナーが自分のチームを登録できる公開フォームを作りたいと思います。

チームには、ブンデスランド(状態)への外部キーがあります。

管理サイトで既に作成した状態を示すドロップダウンリストが必要です。それからフォームから選んだ。私の "python crash course" -bookはこれをカバーしていないので、助けてください。これまでドキュメントやstackoverflowで見つかった答えは私にとっては役に立たなかった。

models.py

from django.db import models 

class Bundesland(models.Model): 
    bdl_kurz = models.CharField(max_length=2) #abbreviation 
    bdl_lang = models.CharField(max_length=25) #full name 
    --snip-- 

class Team(models.Model): 
    bdl = models.ForeignKey(Bundesland) 
    name = models.CharField(max_length=40) 
    plz = models.CharField(max_length=5) 
    ort = models.CharField(max_length=40) 
    strasse = models.CharField(max_length=40) 
    strnr = models.CharField(max_length=5) 
    telefon = models.CharField(max_length=20) 
    email = models.EmailField() 
    --snip-- 

forms.py:

from django import forms 

from .models import Team 

class TeamForm(forms.ModelForm): 
    class Meta: 
     model = Team 
     bdl = forms.ModelChoiceField(queryset='bdl_lang.objects.all()), empty_label=None) 
     fields = ['name', 'plz', 'ort', 'strasse', 'strnr', 'telefon', 'email'] 
     labels = {'plz': 'PLZ', 'ort': 'Ort', 'strasse': 'Straße', 'strnr': 'Hausnr.', 'telefon': 'Telefon', 'email': 'Email'} 

new_team.html:

<p>New Team</p> 
<form action="{% url 'teilnehmer:new_team' %}" method='post'> 
    {% csrf_token %} 
    {{ form.as_p }} 
<button name="submit">Submit data</button> 
</form> 

views.py:だから私はあなたのコード内の問題の数を選ぶことができます

from django.shortcuts import render 
from django.http import HttpResponseRedirect 
from django.core.urlresolvers import reverse 

from .models import Bundesland, Gewichtsklasse, Team, Kaempfer 
from .forms import TeamForm 

--snip-- 

def new_team(request): 
    """Add a new team.""" 
    if request.method != 'POST': 
     # No data submitted; create a blank form 
     form = TeamForm() 
    else: 
     # POST data submitted; process data. 
     form = TeamForm(request.POST) 
     if form.is_valid(): 
      form.save() 
      return HttpResponseRedirect(reverse('teilnehmer:index')) 

    context = {'form': form} 
    return render(request, 'teilnehmer/new_team.html', context) 
+0

メタでフィールドを定義することはできません。クラスレベルにする必要があります。しかし、 'bdl'を' fields'リストに入れるのはなぜですか? –

+0

本当ですか?私はそれが簡単だと思っていませんでした。このサイトを破棄して申し訳ありません。大変ありがとう! –

答えて

0

(重要な場合)。

  1. bdl = forms.ModelChoiceField(queryset='bdl_lang.objects.all()), empty_label=None) - 等号の直後に開始引用符は必要ありません。
  2. bdl_langCharFieldですので、bdl_lang.objects.all()は意味がありません。クエリーセットは、Djangoオブジェクト(モデルクラスを介して定義されたもの)のオーダーディクテーションです。これをbdl.objects.all()に置き換えてください。ここから、Bundesland__unicode__(self)メソッドを挿入します。このメソッドは、選択したい名前を返します。あなたのコードを見て、あなたはbdl_langを返すと思うでしょう。
  3. フィールドオプションにbdlを含める必要があります。

こちらがお役に立てば幸いです。

関連する問題