2010-01-22 15 views
7

Tôi có một hình thức mà tôi xác nhận trong phương pháp sạch cho dù một đối tượng ProjectMembership đã tồn tại, có cùng giá trị cho dự án và thành viên . Điều này là do tôi có trong mô hình ProjectMembership đã định nghĩa ràng buộc unique_together cho dự án và thành viên. Điều này hoạt động tốt thực sự.django - làm thế nào để kiểm tra trong một phương pháp sạch của một hình thức cho dù đó là một chèn hoặc cập nhật

class ProjectMembershipForm(forms.ModelForm): 

    project = forms.ModelChoiceField(Project.objects, widget=HiddenInput()) 

    class Meta: 
     model = ProjectMembership 

    def clean(self): 
     cleaned_data = self.cleaned_data 

     project = cleaned_data.get("project") 
     member = cleaned_data.get("member") 

     print ProjectMembership.objects.filter(project=project, member=member).count() 
     if ProjectMembership.objects.filter(project=project, member=member).count() > 0: 
      del cleaned_data["project"] 
      del cleaned_data["member"] 
      raise forms.ValidationError('The user "%s" is already part of the project team for project "%s".' % (member, project)) 
     return cleaned_data 

Nhưng bây giờ tôi tự hỏi làm cách nào để có thể đánh giá mối quan hệ mới hoặc cập nhật mối quan hệ. Bởi vì với phương pháp sạch này, bạn không thể cập nhật, vì nó trả về thông báo lỗi rằng mục nhập đã tồn tại.

+0

Bạn đã tìm thấy một giải pháp cho điều này? Đang cố gắng làm tương tự bản thân mình, nhưng không thể tìm thấy một giải pháp. – espenhogbakk

+0

Không có giải pháp nào. Tôi chỉ sử dụng hai hình thức bây giờ, một cho việc cập nhật và một cho chèn. Trong biểu mẫu cập nhật, bạn phải tắt các trường duy nhất cùng nhau để đảm bảo bạn không vi phạm ràng buộc này. Cách tiếp cận này có bất lợi là bạn không thể cập nhật các trường có ràng buộc cùng nhau duy nhất .. –

Trả lời

5

Bạn có thể thử thay đổi này:

if ProjectMembership.objects.filter(project=project, member=member).count() > 0: 

một cái gì đó như thế này:

if ProjectMembership.objects.filter(project=project, member=member).exclude(pk=self.instance.id).count() > 0: 

thực sự bạn cần phải kiểm tra xem self.instance không phải là Không trước khi bạn sử dụng nó trong loại trừ nhưng hy vọng này đoạn mã nhỏ đã cho bạn một số ý tưởng làm thế nào yo có thể hoàn thành nhiệm vụ của bạn mà không có hình thức trùng lặp.

16

Hãy thử điều này:

if self.instance.pk: 
    update_procedure() 
else: 
    insert_procedure() 
Các vấn đề liên quan