简体   繁体   中英

Django decorators . Need help to find a solution for class based views

This is the files I'm working on. How do I restrict user to access this page? I want only admin to access this page. I've tried to use the custom decorators but it shows error for class-based-view. I'm a beginner so anyone can help??

views.py

class student_register(CreateView):
     model = User
     form_class = StudentSignUpForm
     template_name = 'registration/student_register.html'


   def form_valid(self, form_class):
       user = form_class.save()
     # login(self.request, user)
       return redirect('datapage')

forms.py

class StudentSignUpForm(UserCreationForm):
     first_name = forms.CharField(required=True)
     last_name = forms.CharField(required=True)
     phone_number = forms.CharField(required=True)
     semester = forms.CharField(required=True)
     email = forms.EmailField(required=True)

     class Meta(UserCreationForm.Meta):
          model = User
    

     @transaction.atomic
     def save(self):
         user = super().save(commit=False)
         user.is_student = True
         user.first_name = self.cleaned_data.get('first_name')
         user.last_name = self.cleaned_data.get('last_name')
         user.email = self.cleaned_data.get('email')
         user.username = self.cleaned_data.get('username')
         user.password1 = self.cleaned_data.get('password1')
         user.password2 = self.cleaned_data.get('password2')
         user.save()
         student = Student.objects.create(user=user)
         student.phone_number=self.cleaned_data.get('phone_number')
         student.semester=self.cleaned_data.get('semester')
         student.save()
         return user

urls.py

urlpatterns = [
          path("loginrequest/", views.login_request, name="login"),
          path("logoutrequest", views.logout_request, name="logout"),
          path('student_register/', student_register.as_view(), name='student_register'),
          path('teacher_register/',views.teacher_register.as_view(), name='teacher_register'),
         ]

student_register.html

<div class="container my-3">
<div class="form-group">
  <h3>Register here!</h3>
  <br>
  <form  method="POST" class="post-form"  enctype="multipart/form-data">
      {% csrf_token %}
  {{ form.as_p }}
  {{ form.media}}
      <button type="submit" class="btn btn-success">Register</button>
  </form>
</div>

You can use the UserPassesTestMixin as




class StudentRegisterView(, CreateView):
    model = User
    form_class = StudentSignUpForm
    template_name = 'registration/student_register.html'

    def form_valid(self, form_class):
        user = form_class.save()
        # login(self.request, user)
        return redirect('datapage')

    

You should use Mixins instead UserPassesTestMixin should be appropriate

class IsAdmin(UserPassesTestMixin):
    def test_func(self):
        return self.request.user.is_admin

    def handle_no_permission(self):
        return redirect('someview')

class StudentRegister(IsAdmin, CreateView):
    ...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM