2010-09-22 11 views
5

मैं मॉडलफॉर्म के साथ एक सरल सीआरयूडी बनाने की कोशिश कर रहा हूं। यह ठीक काम करता है सिवाय इसके कि हर बार जब मैं संपादित करता हूं, तो बचत डेटा का एक नया उदाहरण बनाता है। तो मैं एक अद्यतन के बजाय डीबी में एक अतिरिक्त पंक्ति संपादित और प्राप्त करता हूं। मुझे एक नुकसान है कि मौजूदा चैरिटी को बचाने के लिए यह कैसे जानता है क्योंकि यह पीके (आईडी) को फॉर्म में एक छिपे हुए फ़ील्ड के रूप में स्टोर नहीं करता है। 'शानदार' मॉडलफॉर्म का उपयोग करने की कोशिश करने से पहले मैंने हमेशा ऐसा किया!Django 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 %} 

उत्तर

5

यह काम नहीं करता है क्योंकि आपका टेम्पलेट हमेशा उस दृश्य को पोस्ट कर रहा है जो एक नया चैरिटी जोड़ता है। जब आप मैन्युअल रूप से URL/charities/edit/5 जैसे URL टाइप करते हैं, तो यह मॉडल प्रारंभिक डेटा के साथ मॉडलफॉर्म बनाता है, लेकिन फिर POSTs/charities/add को जोड़ता है, इस प्रकार एक नया उदाहरण बनाते हैं। उदाहरण के लिए आपको/दान/संपादन/5 पर पोस्ट करने की आवश्यकता है। यूआरएल टेम्पलेट टैग पर एक नज़र डालें।

मेरा सुझाव है कि आप 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 करना चाहते हैं, वे आपके जैसे साधारण मामलों में बहुत उपयोगी हैं।

+0

हाय टियागो, उत्तर देने के लिए धन्यवाद। मैंने जेनेरिक_अपडेट/पहले विचारों के बारे में नहीं सुना था। मैं उन पर पढ़ूंगा। बस मौजूदा विधि को काम करने की कोशिश कर रहा है, मैं charity.id से आईडी निकालने के लिए प्रतीत नहीं कर सकता, ताकि इसे संपादन यूआरएल में जोड़ सकूं। मैंने form.id भी कोशिश की लेकिन यह संदर्भ में नहीं है। इसके अलावा, charities_app क्या है? क्या आप बस मेरे लिए जगह बदलने के लिए प्लेसहोल्डर डाल रहे हैं? मेरे सदस्य के दृश्य में मैंने {% url race.members.views.edit member.id%} का उपयोग करने का प्रयास किया लेकिन त्रुटि मिली ............... rendering के दौरान ViewDoesNotExist पकड़ा: मॉड्यूल दौड़ में घर का प्रयास किया .charities.views। – Rich

+0

मैं बेवकूफ भूल गया कि मैं संदर्भ के माध्यम से सदस्य/चैरिटी आईडी पास कर सकता हूं। तो अब मेरे पास संपादन यूआरएल में आईडी है और यह निश्चित रूप से काम करता है। धन्यवाद। अब मैं सिर्फ यह समझने की कोशिश कर रहा हूं कि आपके यूआरएल {% url charities_app.views.edit charity.id%} के समान कार्रवाई यूआरएल को कैसे बदला जाए। Charities_app क्या है। क्या यह दृष्टिकोण का मार्ग होना चाहिए? क्या मुझे get_absolute_url परिभाषित करने की आवश्यकता है? – Rich

+0

हाय, इस मामले में charities_app उस ऐप का नाम होगा जिसमें चैरिटीज़ मॉडल शामिल है। charities_app.view.edit सिर्फ उस दृश्य का नाम है जो अनुरोध को संसाधित करने जा रहा है। यह यूआरएल टैग उपयोगी है क्योंकि आपको अपने टेम्पलेट्स में यूआरएल को कड़ी मेहनत करने की ज़रूरत नहीं है .. इस तरह, अगर आप urls.py में यूआरएल मैपिंग्स को बदलना चुनते हैं, तो आपको टेम्पलेट्स को अपडेट करने की आवश्यकता नहीं है :) –

संबंधित मुद्दे