Django ModelForms: cleanest way to hide fields and enforce defaults -
let's have single modelform can filled out different tiers of users. admin can edit field of form; other users, need have fields pre-defined, , read-only and/or hidden.
using cbv's get_form_kwargs method, have made form aware of user that's bringing up, and, in __init__ method react accordingly, tweaking form's exclude, , fields' required , initial properties; , then, in view's form_valid, further enforce values. but, frankly, i'm neither sure every operation needed, nor whether there's gaping hole i'm not aware of.
so, what's best, cleanest way of doing this?
assuming there aren't lot of combinations, create different form meets different needs of users. override def get_form_class , return correct form based on needs. keeps different use cases separate , gives flexibility if need change things in future without breaking other forms.
# models.py class foo(models.model): bar = model.charfield(max_length=100) baz = model.charfield(max_length=100) biz = model.charfield(max_length=100) # forms.py class fooform(forms.modelform): # admins class meta: model = foo class fooform(forms.modelform): # users can't see bar boo = forms.charfield() class meta: model = foo exclude = ['bar'] class fooformn(forms.modelform): # many different scenarios need def __init__(self, *args, **kwargs) super(fooformn, self).__init__(*args, **kwargs) self.fields['biz'].widget.attrs['readonly'] = true class meta: model = foo # views.py class someview(updateview): def get_form_class(self): if self.request.user.groups.filter(name="some_group").exists(): return fooform # etc.
Comments
Post a Comment