Как использовать для создания пользовательских декораторов в Django?

#django #decorator #profile

#django #декоратор #Профиль

Вопрос:

Я абсолютно новичок в python, django framework. Я не знаю, как создавать пользовательские декораторы в django. Я пытаюсь, если профиль пользователя завершен на 100%, они могут применить задание, иначе они могут показать предупреждающее сообщение «ваш профиль не завершен, пожалуйста, прежде всего заполните свой профиль, а затем примените это задание»

У меня есть следующий код models.py

 class profile(models.Model):
    user = models.OneToOneField(User, on_delete = models.CASCADE, primary_key=True)
    random = models.CharField(max_length=50)
    image = models.ImageField(upload_to="profile_pics")

    def __str__(self):
        return f'{self.user.username} profile'

    def get_absolute_url(self):
        return reverse('jobseeker:profile_count')



    @property 
    def percentage_complete(self):
        percent = { 'random': 50, 'image': 50}
        total = 0
        if self.random:
            total  = percent.get('random', 0)
        if self.image:
            total  = percent.get('image', 0)
        return total
  

decorators.py

 def complete_profile_required(view_func):
def wrapper_func(request, *args, **Kwargs):
    if request.user.profile.percentage_complete == 100:
        print(request.user.profile.percentage_complete)
        return redirect('jobseeker:apply_job')
    else:
        return view_func(request, *args, **Kwargs)
return wrapper_func
  

views.py

 @login_required
@jobseeker_required
@complete_profile_required
def apply_job(request):
    return render(request, 'apply_job.html')
  

urls.py

  path('apply_job', views.apply_job, name='apply_job')
  

он вернет ошибку this

Ответ №1:

Вы должны перенаправить на другой вид. Вы получаете TOO_MANY_REDIRECTS ошибку. Потому что вы перенаправляете его в тот же вид.

Вы должны изменить свой декоратор

 def complete_profile_required(view_func):
  def wrapper_func(request, *args, **Kwargs):
    if request.user.profile.percentage_complete == 100:
        # change your logic here
        return redirect('jobseeker:another_view')
    else:
        return view_func(request, *args, **Kwargs)
return wrapper_func