Как передать текущего зарегистрированного пользователя в класс формы в django - PullRequest
1 голос
/ 17 апреля 2020

Я пытаюсь создать форму, в которой одно поле является полем ModelChoice. Я пытаюсь заполнить это поле объектами из другой модели. Я столкнулся с проблемой, поскольку мне нужно, чтобы текущий зарегистрированный пользователь в форме фильтровал набор запросов. Вот 2 модели

class UserExercises(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    name = models.CharField(max_length=50)
    Muscle = models.ForeignKey(Muscle, on_delete=models.CASCADE)


class Exercise(models.Model):
    exercise = models.ForeignKey(UserExercises, on_delete=models.CASCADE)
    weight = models.DecimalField(max_digits=6, decimal_places=3)
    reps = models.PositiveIntegerField(validators=[MaxValueValidator(100)])
    difficulty = models.CharField(max_length=30)
    date = models.DateTimeField(default=timezone.now)
    user = models.ForeignKey(User, on_delete=models.CASCADE)

А вот моя форма

class AddExerciseForm(forms.Form):
    exercise = forms.ModelChoiceField(queryset=UserExercises.objects.filter(user=1))

    class Meta:
        model = Exercise
        fields = ['exercise', 'weight', 'reps', 'difficulty']

Как вы можете видеть, я сейчас жестко кодирую фильтр в ModelChoiceField, но хочу заменить его на текущие пользователи Id. Есть ли в любом случае об этом. Я новичок в django, поэтому любая помощь будет оценена.

My View

@login_required
def add_exercise_view(request):
    if request.method == 'POST':
        user_id = request.user.id
        form = AddExerciseForm(user_id=user_id)
        if form.is_valid():
            form.save()
            return redirect('myfit-home')
    else:
        form = AddExerciseForm()

    return render(request, 'users/register.html', {'form': form})

Ответы [ 2 ]

0 голосов
/ 17 апреля 2020

Во-первых, AddExerciseForm должно расширяться forms.ModelForm.

Чтобы инициализировать данные формы на основе некоторого параметра, вы можете переопределить __init_ метод ModelForm для обновления полей формы (это поле exercise в данном случае) на основе некоторого аргумента / параметра (в данном случае user_id).

class AddExerciseForm(forms.ModelForm):

    class Meta:
        model = Exercise
        fields = ['exercise', 'weight', 'reps', 'difficulty']

    def __init__(self, *args, **kwargs):
        user_id = kwargs.pop('user_id', None)
        super(AddExerciseForm, self).__init__(*args, **kwargs)
        if user_id is not None:
            # update queryset for exercise field
            self.fields['exercise'].queryset = UserExercises.objects.filter(user=user_id)
        else:
            # UserExercises.objects.none() will return an empty queryset
            self.fields['exercise'].queryset = UserExercises.objects.none()

И передайте user_id при инициализации формы в представлении:

if request.user.is_authenticated():
    # get user id
    user_id = request.user
    form = AddExerciseForm(user_id=user_id)
0 голосов
/ 17 апреля 2020

переопределить __init__ метод Form и передать пользователя в качестве аргумента

      def __init__(self,user,*args, **kwargs):
          self.user = user
          super().__init__(*args, **kwargs)
          self.fields['exercise'].queryset= 
          UserExercises.objects.filter(user=self.user))
          self.fields['exercise'].widget = forms.CheckboxSelectMultiple
     class Meta:
      model = Exercise
      fields = ['exercise', 'weight', 'reps', 'difficulty']       
...