Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 创建表单以激活用户权限_Python_Django_Django Forms - Fatal编程技术网

Python 创建表单以激活用户权限

Python 创建表单以激活用户权限,python,django,django-forms,Python,Django,Django Forms,我想要一个django表单,它是一个用户的实例,并获得一个由单选按钮组成的html表单来激活或取消激活权限 这种html代码应在结尾处出现: <div class="form-group"> <label for="change_user">Can edit user:</label> <div class="labeled" id="change_user"> <input class="with-gap"

我想要一个django表单,它是一个用户的实例,并获得一个由单选按钮组成的html表单来激活或取消激活权限

这种html代码应在结尾处出现:

<div class="form-group">
    <label for="change_user">Can edit user:</label>
    <div class="labeled" id="change_user">
        <input class="with-gap" name="change_user_False" type="radio" id="change_user_False" value="False">
        <label for="change_user_False">No</label>
        <input class="with-gap" name="change_user_True" type="radio" id="change_user_True" value="True" checked="">
        <label for="change_user_True">Yes</label>
    </div>
</div>
或者使用用户实例的一种形式:

from django.contrib.auth.models import User
from django import forms

class ProfileForm(forms.ModelForm):
    class Meta:
        model = User
        fields = []
        widget = ...

但是,如何在radioselect中根据权限生成小部件,并在返回的数据错误时捕获错误?

您可以使用Django
UpdateView
ModelForm
解决您的问题,如以下示例所示(请参阅注释以了解发生的情况):

forms.py:

from django import forms
from YOUR_APP_NAME import models

class UserPermissionsForm(forms.ModelForm):
    change_user = forms.ChoiceField(
        widget=forms.RadioSelect,
        choices=[(True, 'Yes'), (False, 'no')],
        required=True  # It's required ?
    )

    class Meta:
        model = models.YOUR_MODEL_NAME
        fields = ('change_user',)  # I'll use only one field
from django.views.generic import UpdateView
from django.urls import reverse_lazy
from django.contrib import messages
from django.contrib.auth.models import Permission 
from YOUR_APP_NAME import models, forms


class UserPermissionView(UpdateView):
    model = models.YOUR_MODEL_NAME
    template_name = 'user_permission.html' # Your template name
    form_class = forms.UserPermissionsForm
    initial = {}  # We'll update the form's fields by their initial values

    def get_initial(self):
        """Update the form_class's fields by their initials"""

        base_initial = super().get_initial()
        # Here we'll check if the user has the permission of 'change_user'
        user_has_permission = self.request.user.user_permissions.filter(
            codename='change_user'
        ).first()
        base_initial['change_user'] = True if user_has_permission else False
        return base_initial

    def form_valid(self, form):
        """
        Here we'll update the user's permission based on the form choice:
        If we choose: Yes => Add 'change_user' permission to the user
                      No => Remove 'change_user' permission from the user
        """
        change_user = form.cleaned_data['change_user']
        permission = Permission.objects.get(codename='change_user')
        if change_user == 'True':
            self.request.user.user_permissions.add(permission)
            # Use django's messaging framework
            # We'll render the results into the template later
            messages.success(
                self.request,
                'Updated: User [{}] Can change user'.format(self.request.user.username)
            )
        else:
            self.request.user.user_permissions.remove(permission)
            messages.success(
                self.request,
                'Updated: User [{}] Cannot change user'.format(self.request.user.username)
            )
        return super().form_valid(form)

    def get_success_url(self):
        """
           Don't forget to add your success URL,
           basically use the same url's name as this class view
        """
        # Note here, we'll access to the URL based on the user pk number
        return reverse_lazy('user_permissions', kwargs={'pk': self.request.user.pk})
from django.urls import path
from YOUR_APP_NAME import views


urlpatterns = [
    path(
           'client/<int:pk>/',  # Access the view by adding the User pk number
           views.UserPermissionView.as_view(), 
           name='user_permissions'
    ),
    ... # The rest of your paths
]
{% if messages %}
    {% for message in messages %}
        {{ message }}
    {% endfor %}
    <br><br>
{% endif %}

<div>User: {{ user.username }}</div>
<form method="POST">
    {% csrf_token %}
    {{ form.as_p }}
    <button type='submit'>Submit</button>
</form>
视图。py:

from django import forms
from YOUR_APP_NAME import models

class UserPermissionsForm(forms.ModelForm):
    change_user = forms.ChoiceField(
        widget=forms.RadioSelect,
        choices=[(True, 'Yes'), (False, 'no')],
        required=True  # It's required ?
    )

    class Meta:
        model = models.YOUR_MODEL_NAME
        fields = ('change_user',)  # I'll use only one field
from django.views.generic import UpdateView
from django.urls import reverse_lazy
from django.contrib import messages
from django.contrib.auth.models import Permission 
from YOUR_APP_NAME import models, forms


class UserPermissionView(UpdateView):
    model = models.YOUR_MODEL_NAME
    template_name = 'user_permission.html' # Your template name
    form_class = forms.UserPermissionsForm
    initial = {}  # We'll update the form's fields by their initial values

    def get_initial(self):
        """Update the form_class's fields by their initials"""

        base_initial = super().get_initial()
        # Here we'll check if the user has the permission of 'change_user'
        user_has_permission = self.request.user.user_permissions.filter(
            codename='change_user'
        ).first()
        base_initial['change_user'] = True if user_has_permission else False
        return base_initial

    def form_valid(self, form):
        """
        Here we'll update the user's permission based on the form choice:
        If we choose: Yes => Add 'change_user' permission to the user
                      No => Remove 'change_user' permission from the user
        """
        change_user = form.cleaned_data['change_user']
        permission = Permission.objects.get(codename='change_user')
        if change_user == 'True':
            self.request.user.user_permissions.add(permission)
            # Use django's messaging framework
            # We'll render the results into the template later
            messages.success(
                self.request,
                'Updated: User [{}] Can change user'.format(self.request.user.username)
            )
        else:
            self.request.user.user_permissions.remove(permission)
            messages.success(
                self.request,
                'Updated: User [{}] Cannot change user'.format(self.request.user.username)
            )
        return super().form_valid(form)

    def get_success_url(self):
        """
           Don't forget to add your success URL,
           basically use the same url's name as this class view
        """
        # Note here, we'll access to the URL based on the user pk number
        return reverse_lazy('user_permissions', kwargs={'pk': self.request.user.pk})
from django.urls import path
from YOUR_APP_NAME import views


urlpatterns = [
    path(
           'client/<int:pk>/',  # Access the view by adding the User pk number
           views.UserPermissionView.as_view(), 
           name='user_permissions'
    ),
    ... # The rest of your paths
]
{% if messages %}
    {% for message in messages %}
        {{ message }}
    {% endfor %}
    <br><br>
{% endif %}

<div>User: {{ user.username }}</div>
<form method="POST">
    {% csrf_token %}
    {{ form.as_p }}
    <button type='submit'>Submit</button>
</form>
url.py:

from django import forms
from YOUR_APP_NAME import models

class UserPermissionsForm(forms.ModelForm):
    change_user = forms.ChoiceField(
        widget=forms.RadioSelect,
        choices=[(True, 'Yes'), (False, 'no')],
        required=True  # It's required ?
    )

    class Meta:
        model = models.YOUR_MODEL_NAME
        fields = ('change_user',)  # I'll use only one field
from django.views.generic import UpdateView
from django.urls import reverse_lazy
from django.contrib import messages
from django.contrib.auth.models import Permission 
from YOUR_APP_NAME import models, forms


class UserPermissionView(UpdateView):
    model = models.YOUR_MODEL_NAME
    template_name = 'user_permission.html' # Your template name
    form_class = forms.UserPermissionsForm
    initial = {}  # We'll update the form's fields by their initial values

    def get_initial(self):
        """Update the form_class's fields by their initials"""

        base_initial = super().get_initial()
        # Here we'll check if the user has the permission of 'change_user'
        user_has_permission = self.request.user.user_permissions.filter(
            codename='change_user'
        ).first()
        base_initial['change_user'] = True if user_has_permission else False
        return base_initial

    def form_valid(self, form):
        """
        Here we'll update the user's permission based on the form choice:
        If we choose: Yes => Add 'change_user' permission to the user
                      No => Remove 'change_user' permission from the user
        """
        change_user = form.cleaned_data['change_user']
        permission = Permission.objects.get(codename='change_user')
        if change_user == 'True':
            self.request.user.user_permissions.add(permission)
            # Use django's messaging framework
            # We'll render the results into the template later
            messages.success(
                self.request,
                'Updated: User [{}] Can change user'.format(self.request.user.username)
            )
        else:
            self.request.user.user_permissions.remove(permission)
            messages.success(
                self.request,
                'Updated: User [{}] Cannot change user'.format(self.request.user.username)
            )
        return super().form_valid(form)

    def get_success_url(self):
        """
           Don't forget to add your success URL,
           basically use the same url's name as this class view
        """
        # Note here, we'll access to the URL based on the user pk number
        return reverse_lazy('user_permissions', kwargs={'pk': self.request.user.pk})
from django.urls import path
from YOUR_APP_NAME import views


urlpatterns = [
    path(
           'client/<int:pk>/',  # Access the view by adding the User pk number
           views.UserPermissionView.as_view(), 
           name='user_permissions'
    ),
    ... # The rest of your paths
]
{% if messages %}
    {% for message in messages %}
        {{ message }}
    {% endfor %}
    <br><br>
{% endif %}

<div>User: {{ user.username }}</div>
<form method="POST">
    {% csrf_token %}
    {{ form.as_p }}
    <button type='submit'>Submit</button>
</form>
从django.url导入路径
从您的应用程序名称导入视图
URL模式=[
路径(
“client/”,#通过添加用户pk号访问视图
views.UserPermissionView.as_view(),
name='user\u权限'
),
…#你剩下的路
]
最后是模板:

用户权限。html:

from django import forms
from YOUR_APP_NAME import models

class UserPermissionsForm(forms.ModelForm):
    change_user = forms.ChoiceField(
        widget=forms.RadioSelect,
        choices=[(True, 'Yes'), (False, 'no')],
        required=True  # It's required ?
    )

    class Meta:
        model = models.YOUR_MODEL_NAME
        fields = ('change_user',)  # I'll use only one field
from django.views.generic import UpdateView
from django.urls import reverse_lazy
from django.contrib import messages
from django.contrib.auth.models import Permission 
from YOUR_APP_NAME import models, forms


class UserPermissionView(UpdateView):
    model = models.YOUR_MODEL_NAME
    template_name = 'user_permission.html' # Your template name
    form_class = forms.UserPermissionsForm
    initial = {}  # We'll update the form's fields by their initial values

    def get_initial(self):
        """Update the form_class's fields by their initials"""

        base_initial = super().get_initial()
        # Here we'll check if the user has the permission of 'change_user'
        user_has_permission = self.request.user.user_permissions.filter(
            codename='change_user'
        ).first()
        base_initial['change_user'] = True if user_has_permission else False
        return base_initial

    def form_valid(self, form):
        """
        Here we'll update the user's permission based on the form choice:
        If we choose: Yes => Add 'change_user' permission to the user
                      No => Remove 'change_user' permission from the user
        """
        change_user = form.cleaned_data['change_user']
        permission = Permission.objects.get(codename='change_user')
        if change_user == 'True':
            self.request.user.user_permissions.add(permission)
            # Use django's messaging framework
            # We'll render the results into the template later
            messages.success(
                self.request,
                'Updated: User [{}] Can change user'.format(self.request.user.username)
            )
        else:
            self.request.user.user_permissions.remove(permission)
            messages.success(
                self.request,
                'Updated: User [{}] Cannot change user'.format(self.request.user.username)
            )
        return super().form_valid(form)

    def get_success_url(self):
        """
           Don't forget to add your success URL,
           basically use the same url's name as this class view
        """
        # Note here, we'll access to the URL based on the user pk number
        return reverse_lazy('user_permissions', kwargs={'pk': self.request.user.pk})
from django.urls import path
from YOUR_APP_NAME import views


urlpatterns = [
    path(
           'client/<int:pk>/',  # Access the view by adding the User pk number
           views.UserPermissionView.as_view(), 
           name='user_permissions'
    ),
    ... # The rest of your paths
]
{% if messages %}
    {% for message in messages %}
        {{ message }}
    {% endfor %}
    <br><br>
{% endif %}

<div>User: {{ user.username }}</div>
<form method="POST">
    {% csrf_token %}
    {{ form.as_p }}
    <button type='submit'>Submit</button>
</form>
{%if消息%}
{消息%中的消息为%s}
{{message}}
{%endfor%}


{%endif%} 用户:{{User.username} {%csrf_令牌%} {{form.as_p}} 提交
下面是此解决方案流程的一些屏幕截图:


当然,您可以在Django管理面板下检查权限的添加/删除操作。

这与我想做的非常接近。但是当我使用
fields=('change\u user',)
(像你一样)时,我会得到fallowing错误
django.core.exceptions.FieldError:为用户指定的未知字段(change\u user)
,因为
user
没有直接的
change\u user
值。。。这就是我在尝试ModelForm方式时遇到的问题。尝试使用
\uuuuuu all\uuuuuu
然后告诉我是否直接使用django的
用户
模型,还是使用foreignkey/
OneToOneField
用户
模型?我直接使用django
用户
模型。我可以调用关系OneToMany(由django权限框架定义)中的任何权限来对其应用小部件。。。而创建带有使用字段和小部件的
ModelForm
是毫无意义的。我想我需要以
的形式处理所有流程(有点像您所做的)。