2010-06-16 50 views
6

Trong mô hình:mô hình Django tránh trùng lặp

class Getdata(models.Model): 
    title = models.CharField(max_length=255) 
    state = models.CharField(max_length=2, choices=STATE, default="0") 
    name = models.ForeignKey(School) 
    created_by = models.ForeignKey(profile) 

    def __unicode__(self): 
     return self.id() 

Trong mẫu:

<form> 
    <input type="submit" value="save the data" /> 
</form> 

Nếu người dùng nhấp vào nút lưu và các dữ liệu trên được lưu trong bảng, làm thế nào để tránh các bản sao , tức là nếu người dùng nhấp một lần nữa vào cùng một nút gửi thì không nên có một mục nhập khác cho cùng một giá trị. Hay là cái gì đó phải được xử lý trong quan điểm?

Trả lời

16

Nếu một lĩnh vực cá nhân cần phải là duy nhất, sau đó bạn chỉ cần thêm unique=True:

class Getdata(models.Model): 
    title = models.CharField(max_length=255, unique=True) 
    state = models.CharField(max_length=2, choices=STATE, default="0") 
    name = models.ForeignKey(School) 
    created_by = models.ForeignKey(profile) 

Nếu bạn muốn có một sự kết hợp của các lĩnh vực phải là duy nhất, bạn cần unique_together:

class Getdata(models.Model): 
    title = models.CharField(max_length=255) 
    state = models.CharField(max_length=2, choices=STATE, default="0") 
    name = models.ForeignKey(School) 
    created_by = models.ForeignKey(profile) 
    class Meta: 
     unique_together = ["title", "state", "name"] 
+0

thanks ....................... – Hulk

+0

Ngoài ra khi getdata được gọi trong chế độ xem cho ví dụ thứ hai theo mặc định, điều này sẽ trả về "tiêu đề" , "tiểu bang" và "tên" là nó? – Hulk

+0

Khi bạn tham chiếu một đối tượng Getdata trong một khung nhìn, bạn sẽ nhận được một đối tượng Getdata, với tất cả các trường của nó. –

2

Các unique_together cũng được đề xuất là cách tốt nhất, nhưng nếu điều đó không phù hợp với nhu cầu của bạn, bạn có thể xử lý nó theo phương pháp sạch của biểu mẫu. ví dụ:

def clean(self): 
    try: 
     Getdata.objects.get(title=self.cleaned_data['title'], 
          state=self.cleaned_data['state'], 
          name=self.cleaned_data['name'], 
          created_by=self.cleaned_data['created_by']) 
     #if we get this far, we have an exact match for this form's data 
     raise forms.ValidationError("Exists already!") 
    except Getdata.DoesNotExist: 
     #because we didn't get a match 
     pass 

    return self.cleaned_data 
+0

Cảm ơn, lời giải thích tốt .. – Hulk

+1

Tôi cũng đã thấy, đối với trường hợp gửi nhiều lần, mọi người đặt trong JavaScript sẽ vô hiệu hóa nút Gửi khi được nhấp và biểu mẫu đã gửi. Giải pháp tốt nhất có lẽ là sự kết hợp của tất cả các giải pháp này. –

+0

Trong mã của tôi tôi đã làm điều tương tự cho thời gian được .. nhưng điều này là không phù hợp từ những người khác .. vì vậy tôi đã phải biết về điều này ..Tiếp theo thời gian tôi có thể sử dụng một mã thích hợp thay vì hack .. – Hulk

1

Tôi nghĩ rằng việc chèn mã Jquery/JS để ẩn nút lưu sẽ là một ý tưởng hay.

Tạo một file custom_validate.js như dưới đây và đặt nó trong tĩnh thư mục (thư mục tập tin tĩnh)

if (!$) { 
    $ = django.jQuery; 
} 

$(document).ready(function() { 
    $("[name=_save]").click(function() { 
     $("[name=_save]").css("visibility", "hidden"); 
    }); 
}); 

Và trong admin.py, thêm mã dưới đây.

class CustomDataForm(forms.ModelForm): 

    class Meta: 
     model = GetData 

class GetDataAdmin(admin.ModelAdmin): 
    # .... 
    ..... 
    form = CustomDataForm 

    class Media: 
     js = ('/static/custom_validate.js',) 
Các vấn đề liên quan