2017-08-16 15 views
0

モデルユーザーのすべての基本フィールドを編集するテンプレートがあります。チェックボックスフォームのDjango権限

ここでは、利用可能なすべての権限がチェックボックスのようなスタイルで表示されるようにしたいと考えています。ユーザーに既に割り当てられているものは既にチェックされているはずです。

ユーザーを編集するためのフォームを使用しているが、権限フォームを完成していないform.pyがあります。

class UserSettingsForm(forms.ModelForm): 
class Meta: 
    model = User 
    fields = (
     'username', 
     'first_name', 
     'last_name', 
     'email', 
     'urnik', 
     'ure_na_teden', 
     'rfid', 
     'oddelek', 
     'status_zaposleni', 
    ) 

def __init__(self, *args, **kwargs): 
    self.request = kwargs.pop("request") 
    super(UserSettingsForm, self).__init__(*args, **kwargs) 
    instance = getattr(self, 'instance', None) 
    self.fields['username'].disabled = True 

def save(self): 
    user = super(UserSettingsForm, self).save() 
    return user 

class UserPermissonsForm(forms.ModelForm): 
class Meta: 
    model = Permission 
    fields = (
     'name', 
     'content_type', 
     'codename', 
    ) 

そしてviews.py:

@login_required 
def uporabnik_uredi(request, username=None): 
user = get_object_or_404(User, username=username) 
uporabnik_form = UserSettingsForm(request.POST or None,request=request, instance=user) 
permissions = [(p.id, p.name) for p in Permission.objects.filter(user=user)] 
data = { 
    'uporabnik' : user, 
    'form' : uporabnik_form, 
    'from': request.GET.get('from', None), 
    'permissions' : permissions, 
} 

if request.POST: 
    if uporabnik_form.is_valid(): 
     user = uporabnik_form.save() 
     next = request.GET.get('next', None) 
     return redirect(next) 
return render(request, "sifranti/uporabniki/uredi.html", data) 

そしてまたテンプレートは、ちょうど現在のアクセス権がユーザーに割り当てられているかを見るために:

<div class=""> 
    {% for id, name in permissions %} 
     {{ id }} - {{ name }} <br> 
    {% endfor %} 
</div> 

答えて

0

これは私が行う方法ですが、私はMultipleSelectを使用して、あなたはチェックボックスにこれを適用することができますね。

class EditUserForm(forms.ModelForm): 

def __init__(self, *args, **kwargs): 
    super(EditUserForm, self).__init__(*args, **kwargs) 

    def get_label(obj): 
     permission_name = str(obj).split('|')[2].strip() 
     model_name = permission_name.split(' ')[2].strip() 
     return '%s | %s' % (model_name.title(), permission_name) 

    User = get_user_model() 
    content_type = ContentType.objects.get_for_model(User) 
    self.fields['user_permissions'].queryset = Permission.objects.filter(content_type=content_type) 
    self.fields['user_permissions'].widget.attrs.update({'class': 'permission-select'}) 
    self.fields['user_permissions'].help_text = None 
    self.fields['user_permissions'].label = "Label" 
    self.fields['user_permissions'].label_from_instance = get_label 

def save(self, commit=True): 
    user_instance = super(EditUserForm, self).save(commit) 
    user_instance.save() 
    user_instance.user_permissions.set(self.cleaned_data.get('user_permissions')) 
    return user_instance 

class Meta: 
    model = get_user_model() 
    fields = ['email', 'first_name', 'last_name', 'user_permissions'] 

    widgets = { 
     'email': forms.EmailInput(attrs={'class': 'form-control', 'style': 'width: 300px;'}), 
     'first_name': forms.TextInput(attrs={'class': 'form-control', 'style': 'width: 300px;'}), 
     'last_name': forms.TextInput(attrs={'class': 'form-control', 'style': 'width: 300px;'}), 
     'user_permissions': forms.SelectMultiple(attrs={'style': 'width: 350px; height: 200px;'}) 
    } 

希望、これは幸運を助けます!

関連する問題