簡體   English   中英

Django Form,具有基於類模型的Class Meta模型和更多字段

[英]Django Form, with Class Meta model based in class model, and more fields

請給我介紹一個類似的案例,希望您能幫助我正確理解和處理此案例。

我有一個簡單的模型案例:

# -*- 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 %}

考慮到我的困難。 我有“城市”和“州”字段,它們位於過濾器的鄰域模板中。

要添加一條記錄,我沒有問題,但是一個簡單的帖子不會再次將NeighborhoodForm的“狀態”中的值返回給模板。 這是因為帖子中發送的值找不到表單的“狀態”字段。

當您打開記錄進行編輯時,會發生相同的事情,即“狀態”字段將不會被填充。

所以這是我的問題。 你能幫助我嗎? 我應該怎么做或我做錯了什么? 感謝大家的協助。

您真正想要的是將自定義值分配並保存到字段。 為此,您必須提供初始值save表格的方法。

如果您有一個對象要從中加載數據,則必須將其傳遞給表單,例如:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM