2009-07-15 43 views
64

Tôi có một biểu mẫu trong đó có một số trường sắp xuất hiện theo yêu cầu khi tôi không muốn chúng. Dưới đây là hình thức từ models.pyTrường yêu cầu Django ở dạng mẫu

class CircuitForm(ModelForm): 
    class Meta: 
     model = Circuit 
     exclude = ('lastPaged',) 
    def __init__(self, *args, **kwargs): 
     super(CircuitForm, self).__init__(*args, **kwargs) 
     self.fields['begin'].widget = widgets.AdminSplitDateTime() 
     self.fields['end'].widget = widgets.AdminSplitDateTime() 

Trong mô hình mạch thực tế, các lĩnh vực được định nghĩa như thế này:

begin = models.DateTimeField('Start Time', null=True, blank=True) 
end = models.DateTimeField('Stop Time', null=True, blank=True) 

views.py tôi cho điều này là ở đây:

def addCircuitForm(request): 
    if request.method == 'POST': 
     form = CircuitForm(request.POST) 
     if form.is_valid(): 
      form.save() 
      return HttpResponseRedirect('/sla/all') 
    form = CircuitForm()  
    return render_to_response('sla/add.html', {'form': form}) 

Tôi có thể làm gì để hai trường này không bắt buộc?

+1

Không có cách nào mà các lĩnh vực này trở nên cần thiết bằng cách thay đổi các widget. Nếu mô hình có (null = True, blank = True), modelForm sẽ hiển thị nó theo yêu cầu = False. – simplyharsh

+0

Có vẻ như bạn đã đúng. Bản thân các trường không bắt buộc nhưng các trường Ngày và Giờ trong tiện ích là bắt buộc. – Ryan

Trả lời

102

Nếu bạn không muốn thay đổi thiết lập trống cho các lĩnh vực của bạn bên trong mô hình (làm như vậy sẽ phá vỡ xác nhận bình thường trong site admin), bạn có thể làm như sau trong lớp Mẫu của bạn:

def __init__(self, *args, **kwargs): 
    super(CircuitForm, self).__init__(*args, **kwargs) 

    for key in self.fields: 
     self.fields[key].required = False 

Các định nghĩa lại constructor sẽ không gây hại cho bất kỳ chức năng nào.

+0

Cảm ơn bạn !!! Nó không chấp nhận 'blank = True' cùng với widget tùy chỉnh của tôi. – osa

16

Nếu trường mô hình trống = True thì yêu cầu được đặt thành False trên trường biểu mẫu. Nếu không, cần = True

Says vì vậy đây: http://docs.djangoproject.com/en/dev/topics/forms/modelforms/

Hình như bạn đang làm tất cả mọi thứ đúng. Bạn có thể kiểm tra giá trị self.fields['end'].required.

+0

Lưu ý rằng một số trường (ví dụ: 'BooleanField') có trống = True hard-coded trong hàm tạo của chúng (https://docs.djangoproject.com/en/dev/_modules/django/db/models/fields/#BooleanField). Vì vậy, thiết lập trống = False sẽ âm thầm thất bại. Bạn phải sử dụng 'self.fields […] .required = True' trong hàm tạo của biểu mẫu để buộc hành vi bắt buộc cho các trường đó. Xem thêm https://code.djangoproject.com/ticket/22282. –

3

Đây không phải là câu trả lời, nhưng đối với bất kỳ ai khác tìm thấy thông tin này qua Google, thêm một chút dữ liệu: điều này đang xảy ra với tôi trên Biểu mẫu mẫu với DateField. Nó đã yêu cầu được đặt thành False, mô hình có "null = True, blank = True" và trường trong biểu mẫu hiển thị bắt buộc = False nếu tôi xem xét nó trong phương thức clean(), nhưng vẫn nói rằng tôi cần ngày hợp lệ định dạng. Tôi không sử dụng bất kỳ tiện ích đặc biệt nào và tôi nhận được thông báo "Nhập ngày hợp lệ" ngay cả khi tôi đặt rõ ràng input_formats = ['% Y-% m-% d', '% m /% d /% Y', ' % m /% d /% y ',' '] trên trường biểu mẫu.

CHỈNH SỬA: Không biết liệu nó có giúp được ai khác không, nhưng tôi đã giải quyết được vấn đề tôi đang gặp phải. Biểu mẫu của chúng tôi có một số văn bản mặc định trong trường (trong trường hợp này, từ "đến" để biểu thị trường là ngày kết thúc; trường được gọi là "end_time"). Tôi đã tìm kiếm từ "to" trong phương thức clean() của form (tôi cũng đã thử phương thức clean_end_time(), nhưng nó chưa bao giờ được gọi) và thiết lập giá trị của biến clean_data thành None như đề xuất trong this Django ticket. Tuy nhiên, không ai trong số đó quan trọng như (tôi đoán) xác nhận của mô hình đã puked trên định dạng ngày không hợp lệ của "để" mà không cho tôi một cơ hội để đánh chặn nó.

+0

Bạn đã giải quyết nó chưa? – Don

+0

Có lẽ sửa chữa này có thể giúp: https://code.djangoproject.com/ticket/13390 – Don

3

Mở rộng về câu trả lời DataGreed, tôi đã tạo ra một Mixin cho phép bạn chỉ định một biến fields_required trên lớp học Meta như sau:

class MyForm(RequiredFieldsMixin, ModelForm): 

    class Meta: 
     model = MyModel 
     fields = ['field1', 'field2'] 
     fields_required = ['field1'] 

Tại đây là:

class RequiredFieldsMixin(): 

    def __init__(self, *args, **kwargs): 

     super().__init__(*args, **kwargs) 

     fields_required = getattr(self.Meta, 'fields_required', None) 

     if fields_required: 
      for key in self.fields: 
       if key not in fields_required: 
        self.fields[key].required = False 
+0

Điều gì sẽ xảy ra nếu người dùng mixin này cũng ghi đè lên '__init__'? mixin sẽ vẫn hoạt động? làm thế nào đa kế thừa sẽ được giải quyết? – user3599803

+0

@ user3599803 khi bạn ghi đè '__init__' bạn nên luôn gọi' super() ', giống như nó được thực hiện trong đoạn trích của tôi. – rednaw

+0

Vì vậy, nếu tôi hiểu - tôi tạo một biểu mẫu và phân lớp MyForm. Tôi gọi siêu từ init(), mà sẽ gọi init mixin, nhưng khi djangl hình thức init được gọi là? – user3599803

0

Từ model field documentation,

Nếu bạn có một mô hình như hình dưới đây,

class Article(models.Model): 
    headline = models.CharField(
     max_length=200, 
     null=True, 
     blank=True, 
     help_text='Use puns liberally', 
    ) 
    content = models.TextField() 

Bạn có thể thay đổi hình thức xác nhận của tiêu đề để required=True thay vì blank=False như của mô hình như xác định trường như được hiển thị bên dưới.

class ArticleForm(ModelForm): 
    headline = MyFormField(
     max_length=200, 
     required=False, 
     help_text='Use puns liberally', 
    ) 

    class Meta: 
     model = Article 
     fields = ['headline', 'content'] 

Vì vậy, trả lời các câu hỏi,

class CircuitForm(ModelForm): 
    begin = forms.DateTimeField(required=False) 
    end = forms.DateTimeField(required=False) 
     class Meta: 
      model = Circuit 
      exclude = ('lastPaged',) 

điều này làm cho beginend để required=False

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