user10898133
user10898133

Reputation:

How make attribute of model only for user.is_staff?

Model Post has the boolean field moderation, which is intended for publishing after approval by admin users (which have user.is_staff as True.

There is a page "Post update", where an user (the author of the post) and admin users can updated the post info. I want that the field moderation (which is a checkbox) is shown only if the user is an admin (user.is_staff == True).

models.py

class Post(models.Model):
    ...
    moderation = models.BooleanField(default=True)
    ...

forms.py

class PostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = ['title', 'body', 'logo']

views.py

class PostUpdateView(PermissionRequiredMixin, UpdateView):
    model = Post
    fields = ['title', 'body', 'logo']
    permission_required = 'post.can_mark_returned'

post_form.html

{% extends "base_generic.html" %}
{% block content %}
    <form action="" method="post" enctype="multipart/form-data">
        {% csrf_token %}
        <table>
            {{ form.as_table }}
        </table>
        <input type="submit" value="Submit" />
    </form>
{% endblock %}

Upvotes: 1

Views: 284

Answers (1)

Ralf
Ralf

Reputation: 16505

This similar question has some ideas for you.


I can also suggest overriding FormMixin.get_form_class() and using modelform_factory():

from django.forms import modelform_factory

class PostUpdateView(PermissionRequiredMixin, UpdateView):
    model = Post
    permission_required = 'post.can_mark_returned'

    def get_form_class(self)
        fields = ['title', 'body', 'logo']
        if self.request.user.is_staff:
            fields.append('moderation')

        return modelform_factory(
            self.model,
            fields=fields)

Upvotes: 2

Related Questions