29👍
This can be achieved in the template when rendering the form. It will need to allow null values or have a default value in the model definition or alternatively have its validation overridden:
<form method="post">{% csrf_token %}
{% if request.user.is_staff %}
<p>{{ form.published }}</p>
{% endif %}
<p>{{ form.author }}</p>
<!-- ... your other fields -->
</form>
Similarly you can check for is_superuser
or check permissions, see the docs: https://docs.djangoproject.com/en/dev/topics/auth/default/#permissions
4👍
You need to pass it the user instance from your request – the model form doesn’t have access to it.
my_form = PostForm(user=request.user)
Then, in your __init__
:
def __init__(self, *args, **kwargs):
published = kwargs.pop('published', None)
user = kwargs.pop('user', None)
super(PostForm, self).__init__(*args, **kwargs)
if not user.is_staff:
del self.fields['published']
- Django – Check diference between old and new value when overriding save method
- Validating a Django model field based on another field's value?
Source:stackexchange.com