79👍
You can alter the fields in a subclass by overriding the init method:
class LoginFormWithoutNickname(LoginForm):
def __init__(self, *args, **kwargs):
super(LoginFormWithoutNickname, self).__init__(*args, **kwargs)
self.fields.pop('nickname')
13👍
Django 1.7 addressed this in commit b16dd1fe019 for ticket #8620. In Django 1.7, it becomes possible to do nickname = None
in the subclass as the OP suggests. From the documentation changes in the commit:
It’s possible to opt-out from a
Field
inherited from a parent class by shadowing it. While any non-Field
value works for this purpose, it’s recommended to useNone
to make it explicit that a field is being nullified.
- [Django]-Django and postgresql schemas
- [Django]-ImportError: cannot import name '…' from partially initialized module '…' (most likely due to a circular import)
- [Django]-Django REST Framework – 405 METHOD NOT ALLOWED using SimpleRouter
5👍
I found that, please comment if interested.
(in Django 1.7.4)
extending forms, with following code:
class MyForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(MyForm, self).__init__(*args, **kwargs)
for key, field in self.fields.iteritems():
self.fields[key].required = False
class Meta:
model = MyModel
exclude = []
field_1 = forms.CharField(label="field_1_label")
field_2 = forms.CharField(label="field_2_label", widget=forms.Textarea(attrs={'class': 'width100 h4em'}),)
field_3 = forms.CharField(label="field_3_label", widget=forms.TextInput(attrs={'class': 'width100'}),)
field_4 = forms.ModelChoiceField(label='field_4_label', queryset=AnotherModel.objects.all().order_by("order") )
class MyForm_Extended_1(MyForm):
field_1 = None
class MyForm_Extended_2(MyForm):
class Meta:
model = MyModel
exclude =[
'field_1',
]
MyForm_Extended_1 set field_1 as None, (the column in db is updated as Null)
MyForm_Extended_2 ignore the field (ignore the column in db during the save)
So, for my purpose, I use the second method.
- [Django]-How to convert JSON data into a Python object?
- [Django]-Substring in a django template?
- [Django]-How can I make a Django form field contain only alphanumeric characters
3👍
I didn’t like the fact (or so I understood) that the exclusion of a field in the second class using “class Meta:” still results in the unused field being in the db.
Perhaps the simplest way is to define an abstract class that has the fields shared by both classes. Then the two original classes above become subclasses of this new class. So the example given at the start of this thread might look the following. It’s a bit more code, but this way you extend a subclass rather than do an (incomplete) exclusion from a super class.
class LoginForm_Common(forms.Form):
username = forms.CharField(max_length=100)
password = forms.CharField(widget=forms.PasswordInput)
class Meta:
abstract = True
class LoginForm(LoginForm_Common):
nickname = forms.CharField(max_length=100)
class LoginFormWithoutNickname(LoginForm_Common):
pass
- [Django]-Difference between APIView class and viewsets class?
- [Django]-Split models.py into several files
- [Django]-How to write a unit test for a django view?