Trường KHÔNG bắt buộc phải sử dụng trường mô hình Django


81

Tôi có một biểu mẫu như thế này:

class My_Form(ModelForm):
    class Meta:
        model = My_Class
        fields = ('first_name', 'last_name' , 'address')

Làm cách nào để đặt trường địa chỉ là tùy chọn?


1
Mô hình trông như thế nào?
Ngenator

Câu trả lời:


98

Đoán mô hình của bạn như thế này:

class My_Class(models.Model):

    address = models.CharField()

Biểu mẫu của bạn cho phiên bản Django <1.8:

class My_Form(ModelForm):

    address = forms.CharField(required=False)

    class Meta:
        model = My_Class
        fields = ('first_name', 'last_name' , 'address')

Biểu mẫu của bạn cho phiên bản Django> 1.8:

class My_Form(ModelForm):

    address = forms.CharField(blank=True)

    class Meta:
        model = My_Class
        fields = ('first_name', 'last_name' , 'address')

3
Trường khóa ngoại thì sao?
digz6666.

18
Sử dụng ModelChoiceField. Vì vậy, nếu định nghĩa lĩnh vực là abc=models.ForeignKey(Abc), bạn có thể viếtabc = forms.ModelChoiceField(queryset=Abc.objects.all(), required=False)
Akshar Raaj

2
Hãy chắc chắn rằng hình thức được nhập khẩu nếu bạn đã không sử dụng nó trước:from django import forms
Justin McCandless

Bạn có chắc chắn Django> 1.8 được chấp nhận blank=Truekhông? Các tài liệu nói khác và mã của tôi không thích nó, họ nói tôi nên sử dụng required=False. Bạn có bị đảo ngược dấu hiệu của mình không?
Luca Bezerra

109
class My_Form(forms.ModelForm):
    class Meta:
        model = My_Class
        fields = ('first_name', 'last_name' , 'address')

    def __init__(self, *args, **kwargs):
        super(My_Form, self).__init__(*args, **kwargs)
        self.fields['address'].required = False

3
Thay vào đó, câu trả lời của akshar có vẻ tốt hơn, phương pháp này ngăn bạn phải thực hiện các thao tác đặt những thứ như help_text và nhãn.
Blackeagle52

3
Phương pháp này đặc biệt hữu ích trong việc xử lý các trường được định nghĩa là FK ở cấp mô hình. Theo phương pháp của akshar, người ta sẽ phải thiết lập querysetthuộc tính.
PritishC


7

Bạn sẽ phải thêm:

address = forms.CharField(required=False)

4
Các thuộc tính trống và rỗng không được sử dụng cho ModelForms
Fernando Ferreira

3
điều này phải nằm trong trường mô hình , không phải trường biểu mẫu. null=True, blank=Truesẽ gây ra các lĩnh vực ModelForm đượcrequired=False
Anentropic

3

Giải pháp của @ Anentropic từ nhận xét về câu trả lời của @ Atma đã hiệu quả với tôi. Và tôi nghĩ nó cũng là cái hay nhất.

Nhận xét của anh ấy:

null = True, blank = True sẽ khiến trường ModelForm được yêu cầu = False

Tôi vừa đặt nó trên trường ManyToMany trong UserProfile lớp và nó hoạt động hoàn hảo.

UserProfileLớp của tôi bây giờ trông giống như thế này (để ý friendstrường):

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    friends = models.ManyToManyField('self', null=True, blank=True)

Tôi cũng nghĩ rằng đây là giải pháp tốt nhất vì bạn làm điều tương tự, đặt nullblankđến True, thời tiết bạn có một charcánh đồng đơn giản hoặc, như tôi có, ManyToManycánh đồng.

Một lần nữa, cảm ơn rất nhiều @Anentropic. :)

Tái bút Tôi đã viết bài này như một bài đăng vì tôi không thể bình luận (tôi có ít hơn 50 danh tiếng) nhưng cũng vì tôi nghĩ bình luận của anh ấy cần được tiếp xúc nhiều hơn.

PPS Nếu câu trả lời này giúp ích cho bạn, vui lòng ghi chú nhận xét của anh ấy.

Chúc mừng :)


3

Giải pháp: sử dụng cả hai blank=True, null=True.

my_field = models.PositiveIntegerField(blank=True, null=True)

Giải trình:

nếu bạn dùng null=True

`my_field = models.PositiveIntegerField(null=True)`

thì my_field là bắt buộc, với * đối với nó trong biểu mẫu, bạn không thể gửi giá trị trống.

nếu bạn dùng blank=True

`my_field = models.PositiveIntegerField(blank=True)`

thì my_field là không bắt buộc, không có * đối với nó trong biểu mẫu, bạn không thể gửi giá trị. Nhưng sẽ nhận được trường null không được phép.

Ghi chú:

1) marking as not required and 
2) allowing null field are two different things.

Mẹo chuyên nghiệp:

Read the error more carefully than documentation.

0

Các câu trả lời trên đều đúng; tuy nhiên, lưu ý rằng cài đặt null=Truetrên ManyToManyField không có hiệu lực ở cấp cơ sở dữ liệu và sẽ đưa ra cảnh báo sau khi di chuyển:

(fields.W340) null has no effect on ManyToManyField.

Một câu trả lời tốt cho điều này được giải thích trong chủ đề khác này .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.