【问题标题】:Django Form, with Class Meta model based in class model, and more fieldsDjango Form,具有基于类模型的类元模型,以及更多领域
【发布时间】:2014-01-15 07:51:45
【问题描述】:

拜托,我有一个类似的案例,我会介绍他们,希望你能帮助我理解和正确处理这个案例。

我有一个简单的模型案例:

# -*- coding: utf-8 -*-
from django.db import models

class City(models.Model):
    name = models.CharField("City", max_length=100, blank=False, null=False)
    state = models.CharField("State", max_length=2, blank=False, null=False)

class Neighborhood(models.Model):
    name = models.CharField("Name", max_length=100, blank=False, null=False)
    city = models.ForeignKey(City, blank=False, null=False)

模型形式:

from django import forms
from app.models import *

class CityForm(forms.ModelForm):
    class Meta:
        model = City

class NeighborhoodForm(forms.ModelForm):
    class Meta:
        model = Neighborhood
    state = forms.CharField("State", max_length=2, required=True)

他们的看法:

城市景观:

from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response
from django.template import RequestContext

from app.forms import CityForm
from app.models import City

STATES = ["AC", "AL", "AP", "AM", "BA", "CE", "DF", "ES", "GO", "MA", "MT", "MS", "MG", "PR",
          "PB", "PA", "PE", "PI", "RJ", "RN", "RS", "RO", "RR", "SC", "SE", "SP", "TO"]

def index(request):
    if "submit" in request.POST:
        form = CityForm(request.POST, request.FILES)
        if form.is_valid():
            form.save(commit=True)

    elif "cancel" in request.POST:
        return HttpResponseRedirect("/")

    else:
        form = CityForm()

    cities = City.objects.all()
    data = {
        "form": form,
        "states": STATES,
        "cities": cities
    }
    return render_to_response("city/index.html", data, context_instance=RequestContext(request))

还有邻居视图:

from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response
from django.template import RequestContext
from app.forms import NeighborhoodForm
from app.models import Neighborhood, City
from app.city.views import STATES


def index(request):
    if "submit" in request.POST:
        form = NeighborhoodForm(request.POST, request.FILES)
        if form.is_valid():
            form.save(commit=True)

    elif "cancel" in request.POST:
        return HttpResponseRedirect("/")
    else:
        form = NeighborhoodForm()

    neighborhoods = Neighborhood.objects.all()
    cities = City.objects.all()
    data = {
        "form": form,
        "states": STATES,
        "cities": cities,
        "neighborhoods": neighborhoods
    }
    return render_to_response("neighborhood/inserir.html", data, context_instance=RequestContext(request))

最后是 Neighborhood 的模板:

{% extends "base.html" %}

{% block content %}
    <form action="" method="post" id="neighborhoodForm" name="neighborhoodForm">
        {% csrf_token %}
        <div>
            <label>State:</label>
            <select id="state" name="state" autofocus="autofocus">
                <option value=""></option>
                {% for item in states %}
                    <option value="{{ item }}"
                            {% if item == form.state.value %}
                            selected="selected"
                            {% endif %}>{{ item }}</option>
                {% endfor %}
            </select>
        </div>

        <div>
            <label>City:</label>
            <select id="city" name="city">
                <option value=""></option>
                {% for item in cities %}
                    <option value="{{ item.id }}"
                            {% if item.id == form.city.value|add:0 %}
                            selected="selected"
                            {% endif %}>{{ item.name }}</option>
                {% endfor %}
            </select>
        </div>
        <div>
            <label>Neighborhood Name:</label>
            <input type="text" id="name" name="name" value="{{ form.name.value|default_if_none:"" }}"/>
        </div>
        <div>
            <button type="submit" id="submit" name="submit" value="submit">Submit</button>
            <button type="submit" id="cancel" name="cancel" value="cancel">Cancel</button>
        </div>
    </form>

    <br/>

    <table border="1">
        <tr>
            <th>Neighborhood Name</th>
            <th>City</th>
            <th>State</th>
        </tr>
        {% for item in neighborhoods %}
        <tr>
            <td>{{ item.name }}</td>
            <td>{{ item.city.name }}</td>
            <td>{{ item.city.state }}</td>
        </tr>
        {% endfor %}
    </table>
{% endblock %}

考虑到社区,我的困难。我有 City 和 State 字段,它们位于过滤器的社区模板中。

要添加一条记录我没有问题,但是一个简单的帖子不会再次将 NeighborhoodForm 的“状态”中的值返回到模板。那是因为在帖子中发送的值没有找到表单的“状态”字段。

当您打开一条记录进行编辑时,会发生同样的事情,即“状态”字段不会被填充。

所以这是我的问题。你能帮助我吗?我该怎么做或我做错了什么? 感谢大家提供的帮助。

【问题讨论】:

  • 您在Neighborhood 表单中将state 保存在哪里?模型没有任何这样的字段来存储值。
  • 我将在 ModelForm NeighborhoodForm 中传递字段 **state = forms.CharField (" State ", max_length = 2, required = True)** 的值。 Neighborhood Model 没有“state”字段,因为该字段已经是 City 的子类。我没有提出他是没有冗余的,主要是因为数据库中会有一个字段。
  • @Arpit,在这种情况下,为了让您更好地理解,我想我需要知道如何将“州”字段模型城市与“州”字段 NeighborhoodForm 连接起来。

标签: python django python-2.7 django-forms django-1.5


【解决方案1】:

您真正想要的是为字段分配和保存自定义值。为此,您必须提供initial valuessave 形式的方法。

如果您有一个要从中加载数据的对象,那么您必须将其传递给表单,例如:

neighbor = Neighborhood.objects.get(pk=1)
form = NeighborhoodForm(instance=neighbor)

上面的代码用与之相关的对象和字段来初始化表单。但它仍然错过了state 字段。要对其进行初始化,您必须为其传递初始值:

neighbor = Neighborhood.objects.get(pk=1)
state = neighbor.city.state
form = NeighborhoodForm(instance=neighbor, initial={'state': state})

或者你可以覆盖表单的__init__ 方法来提取值:

def __init__(self, *args, **kwargs):
    super(NeighborhoodForm, self).__init__(*args, **kwargs)
    if 'instance' in kwargs:
        state = self.instance.city.state
        self.fields['state'].initial = state

您可以通过覆盖保存方法类似地保存数据:

def save(self, *args, **kwargs):
    new_neighbor = super(NeighborhoodForm, self).save(*args, **kwargs)
    city = City.objects.create(state=self.cleaned_data['state'])
    new_neighbor.city = city
    new_neighbor.save()
    return new_neighbor

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-29
    相关资源
    最近更新 更多