【问题标题】:Only staff user should post a product in django只有员工用户才能在 django 中发布产品
【发布时间】:2021-01-20 15:00:18
【问题描述】:

我正在使用一个电子商务应用程序,登录的每个人都可以发布他们的产品,但我希望只有员工用户在员工用户为真时发布产品: 我的models.py是:

class User(AbstractBaseUser):
    email = models.EmailField(max_length=255 ,unique=True)
    full_name = models.CharField(max_length=255, blank=True, null=True)
    active = models.BooleanField(default=True)  #can login
    staff = models.BooleanField(default=False)  #staff user non super user
    admin = models.BooleanField(default=False)  #superuser
    time_stamp = models.DateTimeField(auto_now_add=True)
    #USERNAME_FIELD and password are required by default
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []
    object = UserManager()
    def __str__(self):
        return self.email

    def get_full_name(self):
        if self.full_name:
            return self.full_name
        return self.email

    def get_short_name(self):
        return self.email

    def has_perm(self, perm, obj=None):
        return True

    def has_module_perms(self , app_label):
        return True

    @property
    def is_staff(self):
        return self.staff
    @property
    def is_admin(self):
        return self.admin

    @property
    def is_active(self):
        return self.active

我用于创建产品的 views.py 是:

class ProductCreateView(LoginRequiredMixin,CreateView):
    model = Product
    template_name = 'product-form.html'
    fields = ['title', 'price' , 'status' , 'size' , 'color', 'image' , 'description']
    def form_valid(self, form):
        form.instance.author = self.request.user
        return super().form_valid(form)

我还希望如果员工是真的,那么导航栏显示为用户创建产品。现在如果用户通过身份验证导航栏显示他发布产品

{% if request.user.is_authenticated %}
      <li class="nav-item {% if request.path == logout_url%}active{% endif %}">
        <a class="nav-link" href="{{ logout_url }}">Logout</a>
      </li>
      <li class="nav-item">
          <a class="nav-link" href="{% url 'profile'%}">Profile</a>
        </li>
      <li class="nav-item">
        <a class="nav-link" href="{% url 'products:product-create'%}">Create Product</a>
      </li>
      {% else%}

【问题讨论】:

  • 我没有看到你在任何地方检查 user.is_staff 属性。到目前为止,您尝试过什么?
  • 为什么不检查self.request.user是否是ProductCreateView.form_valid中的管理员

标签: python django django-models backend


【解决方案1】:

您可以像这样在视图中使用UserPassesTestMixin

class ProductCreateView(UserPassesTestMixin,CreateView):
    model = Product
    template_name = 'product-form.html'
    fields = ['title', 'price' , 'status' , 'size' , 'color', 'image' , 'description']
    def form_valid(self, form):
        form.instance.author = self.request.user
        return super().form_valid(form)

    def test_func(self):
        return self.request.user.is_staff

在模板中你可以用这个{% if request.user.is_staff %}进行测试

【讨论】:

  • 先生,它正在工作,但现在它允许员工用户访问管理面板。如何克服这个
  • 如果您只希望超级用户访问管理面板@KhîzerKhan,您可以使用if request.user.is_superuser 检查超级用户(管理员)
  • 先生,我是 django 新手,我不明白。请详细说明
  • 你在使用 django 管理面板吗?如果是这样,默认情况下员工用户可以访问 django 管理面板,但除非超级用户分配任何权限,否则他们将没有任何权限。
  • 不,先生,我不希望员工用户访问管理面板,我希望他仅从前端发布产品。它现在正在发布。但它现在也可以访问我不想要的管理面板
【解决方案2】:

您应该签出 staff_member_required 装饰器,并且如已回答的那样,在您的模板中使用 {% if user.is_staff %} 进行导航。

【讨论】:

    猜你喜欢
    • 2014-07-13
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 2020-08-15
    • 1970-01-01
    • 2023-01-10
    • 2014-11-15
    相关资源
    最近更新 更多