Django:如何使用foreignkey制作表单

时间:2016-10-28 10:47:22

标签: python django-models django-forms django-views

您好我正在使用Django,我正在尝试建立一个小系统来注册人员和团队。

到目前为止,我可以在管理网站中创建团队和人员。

现在,我想制作一个公开表格,即培训师可以注册他的团队。

团队 Bundesland (州)的外键。

我想要一个下拉列表,显示我已在管理站点中创建的状态。然后在表单中选择它。我的" python速成课程" -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)

1 个答案:

答案 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()。在此处,在您的班级__unicode__(self)中插入Bundesland方法。此方法应在您的选择中返回您想要的名称。从查看代码开始,您似乎想要返回bdl_lang
  3. 您需要在字段选项中加入bdl
  4. 我希望这有帮助!