Ric*_*ich 5 django django-models django-forms
我正在尝试使用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
Run Code Online (Sandbox Code Playgroud)
视图:
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})
Run Code Online (Sandbox Code Playgroud)
形成:
class CharityForm(ModelForm):
class Meta:
model = Charities
Run Code Online (Sandbox Code Playgroud)
模板:
{% 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 %}
Run Code Online (Sandbox Code Playgroud)
它不起作用,因为您的模板始终POST到添加新Charity的视图.当您手动键入/ charities/edit/5之类的URL时,它会使用正确的初始数据创建ModelForm,然后POST到/ charities/add,从而创建一个新实例.例如,您需要POST到/ charities/edit/5.看一下url模板标签.
我建议你使用2个模板,一个用于添加,另一个用于编辑.我知道它可能不是很干,但我相信这样更清楚.
添加模板:
{% 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 %}
Run Code Online (Sandbox Code Playgroud)
编辑模板:
{% 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 %}
Run Code Online (Sandbox Code Playgroud)
您可能还想检查create_object和update_object通用视图,它们在像您这样的简单情况下非常有用.
| 归档时间: |
|
| 查看次数: |
2671 次 |
| 最近记录: |