gpt4 book ai didi

Django ModelForm

转载 作者:行者123 更新时间:2023-12-04 19:20:44 28 4
gpt4 key购买 nike

我正在尝试使用 ModelForm 创建一个简单的 CRUD。它工作正常,只是每次我编辑时,保存都会创建一个新的数据实例。所以我编辑并在数据库中获得了一个额外的行而不是更新的行。我不知道它如何知道如何保存现有的慈善机构,因为它没有将 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 %}

最佳答案

它不起作用,因为您的模板始终发布到添加新 Charity 的 View 。当您手动输入像/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 %}

编辑模板:
{% 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 通用 View ,它们在像您这样的简单情况下非常有用。

关于Django ModelForm,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3765557/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com