首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django ModelForm

Django ModelForm
EN

Stack Overflow用户
提问于 2010-09-22 08:49:16
回答 1查看 2.8K关注 0票数 5

我正在尝试用ModelForm创建一个简单的CRUD。它工作得很好,除了每次我编辑时,保存都会创建一个新的数据实例。因此,我在DB中编辑并获得额外的行,而不是更新的行。我不知道它如何知道如何保存现有的慈善机构,因为它没有将PK (id)作为隐藏字段存储在表单中。这就是我在尝试使用“令人难以置信的”ModelForm之前总是这样做的!

这快把我逼疯了,我读了所有的东西,就我所能说的,我做的每件事都是对的。

这是我的代码..

型号:

代码语言:javascript
复制
from django.db import models
from django.conf import settings

COUNTRY_CHOICES = settings.COUNTRIES

class Charities(models.Model):
    charity_name            = models.CharField(max_length=100)
    country                 = models.CharField(max_length=4, choices=COUNTRY_CHOICES)
    registration_number     = models.CharField(max_length=100)
    address1                = models.CharField(max_length=100)
    address2                = models.CharField(max_length=100)
    city                    = models.CharField(max_length=30)
    zip                     = models.CharField(max_length=10)
    phone                   = models.CharField(max_length=20)
    email                   = models.EmailField()
    charity_logo_image      = models.CharField(max_length=100)
    charity_banner_image    = models.CharField(max_length=100)
    charity_accepted        = models.IntegerField()

    def __str__(self):
       return self.charity_name

    def __unicode__(self):
        self.charity_name

查看:

代码语言:javascript
复制
def list(request):
    charities = Charities.objects.all()
    return render_to_response('charities_charity_list.html', {'charities': charities})

def add(request):
    return add_or_edit(request)

def edit(request, charity_id):
    return add_or_edit(request, charity_id)

def add_or_edit(request, charity_id=None):
    print "ID = " + str(charity_id)  
    form = CharityForm(request.POST or None,
                   instance=charity_id and Charities.objects.get(pk=charity_id))

    # Save new/edited student
    if request.method == 'POST' and form.is_valid():
        print form
        form.save()
        return HttpResponseRedirect('/charities/list/')

    return render_to_response('charities_charity_edit.html', {'form': form})

表格:

代码语言:javascript
复制
class CharityForm(ModelForm):
    class Meta:
        model = Charities

模板:

代码语言:javascript
复制
{% extends "base.html" %}

{% block title %}Charities Add{% endblock %}
{% block content %}

<form method="post" action="/charities/add/" id="save"><table cellpadding="0">{{ form.as_table}}</table><input type="submit" value="Save"></form>
{% endblock %}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-09-22 11:08:38

它不起作用,因为您的模板始终是添加新慈善的视图的POSTing。当您手动输入一个URL时,比如/charities/ ModelForm /5,它会使用正确的初始数据创建编辑,但随后会将其发送到/charities/add,从而创建一个新的实例。例如,您需要发布到/charities/edit/5。看一看url模板标签。

我建议你使用两个模板,一个用于添加,另一个用于编辑。我知道天气可能不是很干燥,但我相信这样会更清楚。

添加模板:

代码语言:javascript
复制
{% extends "base.html" %}

{% block title %}Charities Add{% endblock %}
{% block content %}

<form method="post" action="{% url charities_app.views.add %}"><table cellpadding="0">{{ form.as_table}}</table><input type="submit" value="Save"></form>
{% endblock %}

编辑模板:

代码语言:javascript
复制
{% extends "base.html" %}

{% block title %}Edit Charity{% endblock %}
{% block content %}

<form method="post" action="{% url charities_app.views.edit charity.id %}"><table cellpadding="0">{{ form.as_table}}</table><input type="submit" value="Save"></form>
{% endblock %}

您可能还想检查create_object和update_object通用视图,它们在像您这样的简单情况下非常有用。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3765557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档