Джанго ModelForm - PullRequest
       2

Джанго ModelForm

5 голосов
/ 22 сентября 2010

Я пытаюсь создать простой CRUD с ModelForm. Он работает нормально, за исключением того, что каждый раз, когда я редактирую, сохранение создает новый экземпляр данных. Поэтому я редактирую и получаю дополнительную строку в БД вместо обновленной. Я в растерянности относительно того, как он знает, как сохранить существующую благотворительность, поскольку он не хранит 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 %}

1 Ответ

5 голосов
/ 22 сентября 2010

Это не работает, потому что ваш шаблон всегда размещает в представлении, которое добавляет новую благотворительность. Когда вы вручную вводите URL-адрес, такой как / charities / edit / 5, он создает ModelForm с правильными начальными данными, но затем отправляет POST в / charities / add, создавая новый экземпляр. Вам нужно отправить в / 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, они очень полезны в простых случаях, подобных вашему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...