2011-10-22 34 views
29

Tôi đã có một mô hình tương tự như sau:Django admin: làm cho có thể chỉnh sửa trong lĩnh vực add nhưng không thể chỉnh sửa

class Product(models.Model): 
    third_party_id = models.CharField(max_length=64, blank=False, unique=True) 

mà sử dụng Django mặc định khóa chính. Tôi muốn người dùng có thể thêm sản phẩm bằng cách đặt third_party_id trên trang thêm, nhưng tôi không muốn trường đó có thể chỉnh sửa trong trang chỉnh sửa để tránh làm hỏng tệp thứ ba_party_id. Trong tài liệu Django, các cài đặt tương tự dường như được sử dụng để thêm và chỉnh sửa. Điều này có thể không?

Trả lời

40

Đừng đặt self.readonly_fields để tránh các vấn đề chủ đề. Thay vì ghi đè get_readonly_fields phương pháp:

def get_readonly_fields(self, request, obj=None): 
    if obj: # obj is not None, so this is an edit 
     return ['third_party_id',] # Return a list or tuple of readonly fields' names 
    else: # This is an addition 
     return [] 
+2

Rất hay, không biết về phương pháp này. +1. Chúng ta có thể làm gì nếu không có phương pháp ghi đè? Bất kỳ chiến lược nào? Nhiều đánh giá cao. –

+1

@YUji, phương thức get_form và get_formset của ModelAdmin bao gồm hầu hết mọi trường hợp sử dụng. Bạn có thể cần phải xem xét mã (options.py), những phương thức đó không được bao gồm trong tài liệu tại thời điểm tôi tìm kiếm giải pháp cho chủ đề này. – shanyu

+0

Tôi chỉ có nghĩa là trong python chung nếu không có một phương pháp thuận tiện để ghi đè lên. Chỉ cần một lock.acquire()? –

0

Tôi không chắc đây có phải là cách tốt nhất hay không nhưng bạn có thể xác định biểu mẫu của riêng bạn cho quản trị viên. Và tùy chỉnh xác nhận third_party_id của bạn, từ chối nếu nó đã được thiết lập:

Admin.py

class ProductAdminForm(forms.ModelForm): 
    class Meta: 
     model = Product 

    def clean_third_party_id(self): 
     cleaned_data = self.cleaned_data 
     third_party_id = cleaned_data['third_party_id'] 
     id = cleaned_data['id'] 
     obj = Product.objects.get(id=id) 
     if obj.third_party_id != third_party_id: 
      raise ValidationError("You cannot edit third_party_id, it must stay as %s" % obj.third_party_id) 
     return third_party_id 


class ProductAdmin(admin.Admin): 
    form = [ProductAdminForm,] 
+0

Tôi chấp nhận câu trả lời của @ shanyu, nhưng cảm ơn! –

5

Trên đây là hữu ích (câu trả lời shanyu bằng cách sử dụng get_readonly_fields), tuy nhiên nó không hoạt động đúng cách nếu được sử dụng trong "StackedInline". Kết quả là hai bản sao của bất kỳ trường nào được đánh dấu chỉ đọc và không thể chỉnh sửa trong trường hợp "thêm". Xem lỗi này: https://code.djangoproject.com/ticket/15602

Hy vọng điều này sẽ giúp người khác tìm kiếm!

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