Django ModelForm

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)

Tia*_*des 5

它不起作用,因为您的模板始终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通用视图,它们在像您这样的简单情况下非常有用.