2010-09-22 31 views
5

Tôi đang cố gắng tạo một CRUD đơn giản với ModelForm. Nó hoạt động tốt ngoại trừ mỗi khi tôi chỉnh sửa, lưu sẽ tạo ra một thể hiện mới của dữ liệu. Vì vậy, tôi chỉnh sửa và nhận thêm một hàng trong DB thay vì một cập nhật. Tôi đang thua lỗ như thế nào nó biết để tiết kiệm một tổ chức từ thiện hiện tại vì nó không lưu trữ PK (id) như là một lĩnh vực ẩn trong biểu mẫu. Đó là cách tôi luôn làm điều đó trước khi cố gắng sử dụng 'ModelForm' tuyệt vời!Django ModelForm

Điều đó thúc đẩy tôi hạt, tôi đã đọc mọi thứ và theo như tôi có thể nói tôi đang làm mọi thứ đúng.

Đây là mã của tôi ..

mẫu:

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 

Xem:

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

Mẫu:

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

mẫu:

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

Trả lời

5

Nó không hoạt động vì mẫu của bạn luôn được BẬT cho chế độ xem thêm một tổ chức từ thiện mới. Khi bạn gõ một URL giống như/charities/edit/5, nó sẽ tạo ra ModelForm với dữ liệu ban đầu bên phải, nhưng sau đó POST tới/charities/add, do đó tạo một thể hiện mới. Ví dụ, bạn cần POST cho/charities/edit/5. Hãy xem thẻ mẫu url.

Tôi khuyên bạn nên sử dụng 2 mẫu, một mẫu để thêm, một mẫu khác để chỉnh sửa. Tôi biết nó có thể không phải là rất khô, nhưng tôi tin rằng nó rõ ràng hơn theo cách này.

Thêm mẫu:

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

Sửa mẫu:

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

Bạn cũng có thể muốn kiểm tra create_object và update_object quan điểm chung chung, chúng rất hữu ích trong trường hợp đơn giản như của bạn.

+0

Hi Tiago, cảm ơn bạn đã trả lời. Tôi đã không nghe nói về các generic_update/tạo các khung nhìn trước đây. tôi sẽ đọc lên chúng. Chỉ cần cố gắng để có được phương pháp hiện tại làm việc, tôi dường như không thể trích xuất ID từ charity.id để thêm nó vào URL chỉnh sửa. Tôi đã thử form.id nhưng cũng không phải trong ngữ cảnh. Ngoài ra, charities_app là gì? đây có phải là bạn chỉ cần đặt một trình giữ chỗ cho tôi để thay thế không? Trong chế độ xem thành viên của tôi, tôi đã thử sử dụng {% url race.members.views.edit member.id%} nhưng gặp lỗi ............... Đã bắt ViewDoesNotExist trong khi hiển thị: Đã cố gắng truy cập trang chủ trong cuộc đua mô-đun .charities.views. – Rich

+0

Tôi đã quên mất tôi có thể chuyển Id thành viên/tổ chức từ thiện qua ngữ cảnh. Vì vậy, bây giờ tôi có ID trong URL chỉnh sửa và nó hoạt động tất nhiên. Cảm ơn. Bây giờ tôi chỉ đang cố gắng hiểu cách thay thế URL hành động tương tự như ví dụ của bạn {% url charities_app.views.edit charity.id%}. Charities_app là gì. Nó có nên là đường dẫn đến khung nhìn không? tôi có cần get_absolute_url xác định không? – Rich

+0

Xin chào, trong trường hợp này charities_app sẽ là tên của ứng dụng có chứa mô hình Từ thiện. charities_app.view.edit chỉ là tên của khung nhìn sẽ xử lý yêu cầu. Thẻ url này rất hữu ích bởi vì bạn không cần phải hardwire các url trong các mẫu của bạn .. Bằng cách đó, nếu bạn chọn thay đổi ánh xạ url trong urls.py, bạn không cần phải cập nhật các mẫu :) –

Các vấn đề liên quan