如何在Django中传递带有ManyToMany字段的request.user



我有两个模型Exercise和Area,Area有很多返回Exercise的字段:

class Exercise(models.Model):
user = models.ForeignKey(Profile, on_delete=models.CASCADE)
name = models.CharField(max_length=100)
class Area(models.Model):
user = models.ForeignKey(Profile, on_delete=models.CASCADE)
name = models.CharField(max_length=100)
exercise = models.ManyToManyField(Exercise, blank=True)

我希望用户能够创建一个新的练习,自动附加到其特定区域,并传入request.user

from .forms import ExerciseForm as e_form
class ExerciseFormView(CreateView):
form_class = e_form
success_url = '/'
def form_valid(self, form):
form.save()
area = Area.objects.get(pk=self.kwargs["area_id"])
new_ex = Exercise.objects.latest('id')
new_ex.user = self.request.user
area.exercise.add(new_ex)
form.instance.user = self.request.user

return JsonResponse({'exercise': model_to_dict(new_ex)}, status=200)

其注册网址:

path('exercise-add-new/<int:area_id>/', ExerciseFormView.as_view(), name='exercise_add_new'),

我应该补充一点,直到我最近将user作为字段添加到练习模型中,并将new_ex.user = self.request.user添加到视图中,这种方法一直有效。现在,当我试图提交表格时,什么也没发生。没有错误,也没有创建任何对象。我已经尝试了new_ex.user = self.request.userform.instance.user = self.request.user,但仍然没有任何结果。

顺便说一句,我的用户属性是身份验证用户模型的ForeignKey:

from django.contrib.auth.models import User
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)

编辑

如果我从练习模型中删除user字段,我的视图就可以工作,但我希望能够查看每个练习的详细信息,但这些详细信息只能由创建它们的用户看到。有没有其他方法可以实现这一点?

  • 我看到您在这两个模型中都涉及到了用户。这是不应该做的
  • 您应该在其中一个模型中使用外键,而不是同时使用这两个模型。这会导致你的逻辑破产
  • 你可以用一个简单的逻辑来完成,比如:从练习中删除用户外键
  • Models.py
class Exercise(models.Model):
name = models.CharField(max_length=100)
  • 视图.py
from .forms import ExerciseForm as e_form
class ExerciseFormView(CreateView):
form_class = e_form
success_url = '/'
def form_valid(self, form):
form.save()
area = Area.objects.get(user__id=request.user.id)
new_ex = Exercise.objects.latest('id')
area.exercise.add(new_ex)
area.save()
form.instance.user = self.request.user
return JsonResponse({'exercise': model_to_dict(new_ex)}, status=200)
  • 获取特定用户的所有练习
a = Area.objects.get(user__id=request.user.id)
exercises = a.exercise.all()

解决方案是在我的Workout模型中创建一个带有Profile外键的用户字段,然后实例化视图。

最新更新