2011-01-12 26 views
36

Có thể là câu hỏi của người mới, vì vậy hãy chịu theo tôi.Làm thế nào để cập nhật một đối tượng từ hình thức chỉnh sửa trong Django?

Tôi có biểu mẫu Django chỉnh sửa một phiên bản nhất định của Mô hình. Để biết đối tượng nào đang được chỉnh sửa, tôi có một trường ẩn chứa id của đối tượng, cùng với URL chứa id.

Câu hỏi đầu tiên: Có id của đối tượng trong trường ẩn đúng cách để thực hiện không?

Mối quan tâm của tôi (có thể không có cơ sở) chỉ có một phần của url là ai đó có thể mở trang của một id đối tượng, gửi biểu mẫu này sang biểu tượng khác và đối tượng đó sau đó sẽ bị ghi đè. Đó là lý do tại sao tôi đang cố gắng sử dụng một lĩnh vực ẩn.

Sự cố khi lưu trữ id trong trường ẩn là, khi xác thực biểu mẫu, Django phàn nàn rằng đối tượng không có id duy nhất (rõ ràng).

Câu hỏi thứ hai: Nếu trường duy nhất là một phần của biểu mẫu, làm cách nào để cho Django bỏ qua thực tế là khóa đó đã tồn tại, để cập nhật đối tượng?

+0

Bạn có thể chỉ cho tôi mẫu của bạn? PS: Có, không có biện pháp bảo vệ tại chỗ (quyền), '/ edit/{{id}} /' sẽ được truy cập bởi bất kỳ ai và nguy hiểm. –

+1

Vâng, tôi có biện pháp bảo vệ, chẳng hạn như kiểm tra đối tượng thuộc về người dùng đã đăng nhập - nhưng ngay cả khi người dùng đó (vì một lý do nào đó không biết tôi) có thể chỉnh sửa đối tượng không mong muốn. –

Trả lời

63

Tại sao bạn không sử dụng ModelForm?

# forms.py 
# ... 
class MyForm(forms.ModelForm): 
    class Meta: 
     model = MyModel 

# views.py 
# ...  
def my_view(request, id): 
    instance = get_object_or_404(MyModel, id=id) 
    form = MyForm(request.POST or None, instance=instance) 
    if form.is_valid(): 
     form.save() 
     return redirect('next_view') 
    return render(request, 'my_template.html', {'form': form}) 
+3

Tuyệt vời - đó là tham số 'instance' mà tôi bị thiếu. Thế giới web rộng lớn dường như có khá thiếu các hướng dẫn về chỉnh sửa các đối tượng với các hình thức trong Django. –

+0

Đó là cách đúng, nhưng nó không trả lời: Quan điểm của bạn có đối số "id" này như thế nào? ánh xạ url hoặc trường ẩn là cách duy nhất? –

+1

Có, và không có gì sai với nó. Bạn có thể có thể tung hứng với các phiên nhưng tôi thực sự không nhìn thấy một điểm. Nếu id được thông qua để xem thì khung nhìn có thể xác định liệu người dùng có quyền cập nhật đối tượng hay không và nhà phát triển nên thực thi kiểm tra này bất kể cách xem được id của đối tượng. –

8

Cập nhật cho Django 1.6 và phiên bản tiếp tục

# forms.py 
# ... 
class MyForm(forms.ModelForm): 

    class Meta: 
    model = MyModel 

# views.py 

def my_view(request, id): 
    instance = MyModel.objects.get(id=id) 
    form = MyForm(request.POST or None, instance=instance) 
    if form.is_valid(): 
      form.save() 
      return redirect('next_view') 
return direct_to_template(request, 'my_template.html', {'form': form}) 
+0

Nếu chế độ xem có chứa tệp hoặc ảnh thì mô tả lượt xem là gì? – Leonardo

+0

Leonardo MyForm (request.POST hoặc None, request.FILES hoặc None, ...) –

+0

Làm cách nào để chuyển đối số từ mẫu tới hàm my_view? Ý tôi là với {% url 'my_view'%} –

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