2010-09-22 10 views
5

ModelForm ile basit bir CRUD oluşturmaya çalışıyorum. Düzenleme yaptığım her seferde, kaydetme, verilerin yeni bir örneğini oluşturur. Bu yüzden güncellenmiş bir dosya yerine DB'de ek bir satır düzenleyip düzenliyorum. PK (id) 'i formda gizli bir alan olarak saklamadığı için varolan bir yardım kuruluşunu nasıl kurtaracağını bildiğim bir kayıptayım. 'Fabulous' ModelForm'u kullanmaya başlamadan önce her zaman böyle yaptım!Django ModelForm

Beni deli ediyor, her şeyi okudum ve her şeyi doğru yaptığımı söyleyebilirim. İşte

benim kodudur

..

Modeli:

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 

Görünüm:

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}) 

Form:

class CharityForm(ModelForm): 
    class Meta: 
     model = Charities 

Şablon:

senin şablon her zaman yeni Charity ekler görünüme deftere nakil çünkü
{% 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 %} 

cevap

5

10 O işi değil `t./Charities/edit/5 gibi bir URL'yi manuel olarak yazdığınızda, doğru ilk veriyi ModelForm ile oluşturur, ardından/charities/add'e gönderir, böylece yeni bir örnek oluşturur. Örneğin/charities/edit/5 için POST'a ihtiyacınız var. URL şablonu etiketine bir göz atın.

Düzenleme için başka bir tane eklemek üzere 2 şablon kullanmanızı öneririm. Çok fazla DRY olamayacağını biliyorum, ama bu şekilde daha net olduğuna inanıyorum.

Ekleme şablonu:

{% 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 %} 

Düzenleme şablonu: Ayrıca create_object kontrol ve jenerik görüşlerini update_object isteyebilirsiniz

{% 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 %} 

, sizinki gibi basit durumlarda çok faydalıdır.

+0

Merhaba Tiago, cevap verdiğiniz için teşekkürler. Daha önce generic_update/görüntülemeyi duymamıştım. Onları okuyacağım. Sadece mevcut yöntemin çalışmasını sağlamaya çalışarak, kimliği düzenleme URL'sine eklemek için kimliğini charity.id'den çıkaramıyorum. Ben de form.id denedim ama sadece bağlamda değil. Ayrıca, charities_app nedir? Bu sadece yerine koymak için bir yer tutucuya mı koyuyor? Üye görüşümde {% url race.members.views.edit member.id%} kullanmayı denedim ancak hata alıyorum ............... Oluşturulduğunda ViewDoesNotExist yakalandı: Modül yarışında ev .charities.views. – Rich

+0

Aptalca üye/hayır kurumu kimliğini bağlam yoluyla geçirebileceğimi aptalca unuttum. Bu yüzden şimdi düzenleme URL'sinde kimliği var ve elbette çalışıyor. Teşekkürler. Şimdi, yalnızca işlem URL'sini {% url charities_app.views.edit charity.id%} örneğinize benzer şekilde nasıl değiştireceğimizi anlamaya çalışıyorum. Charities_app nedir. Manzaraya giden yol mu olmalı? get_absolute_url tanımlanmış mı olmalıyım? – Rich

+0

Merhaba, bu durumda charities_app Charities modelini içeren uygulamanın adı olacaktır. charities_app.view.edit, yalnızca isteği işleyecek olan görünümün adıdır. Bu url etiketi, şablonlarınızdaki URL'leri sabitlemek zorunda olmadığınız için kullanışlıdır. Bu şekilde, urls.py dosyasındaki url eşlemelerini değiştirmeyi seçerseniz, şablonları güncellemenize gerek yoktur :) –