我正在尝试用ModelForm创建一个简单的CRUD。它工作得很好,除了每次我编辑时,保存都会创建一个新的数据实例。因此,我在DB中编辑并获得额外的行,而不是更新的行。我不知道它如何知道如何保存现有的慈善机构,因为它没有将PK (id)作为隐藏字段存储在表单中。这就是我在尝试使用“令人难以置信的”ModelForm之前总是这样做的!
这快把我逼疯了,我读了所有的东西,就我所能说的,我做的每件事都是对的。
这是我的代码..
型号:
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查看:
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})表格:
class CharityForm(ModelForm):
class Meta:
model = Charities模板:
{% 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 %}发布于 2010-09-22 11:08:38
它不起作用,因为您的模板始终是添加新慈善的视图的POSTing。当您手动输入一个URL时,比如/charities/ ModelForm /5,它会使用正确的初始数据创建编辑,但随后会将其发送到/charities/add,从而创建一个新的实例。例如,您需要发布到/charities/edit/5。看一看url模板标签。
我建议你使用两个模板,一个用于添加,另一个用于编辑。我知道天气可能不是很干燥,但我相信这样会更清楚。
添加模板:
{% 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 %}编辑模板:
{% 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通用视图,它们在像您这样的简单情况下非常有用。
https://stackoverflow.com/questions/3765557
复制相似问题