【发布时间】:2024-10-05 04:20:02
【问题描述】:
作为 django 开发人员,我是一个新手,我正在尝试构建一个排名网络应用程序。 我想要做的是,一旦用户通过一个清晰的表单创建了一个新问题,自动更改 m2m 模型并将该新问题与选项相关联。选项是从 1 到 5 的固定等级,用户不能操纵它们,也不会显示在问题创建表单上。
根据我的阅读,我猜这个操作可以通过 m2m_changed 信号(或 post_save,不确定)来完成,但我并不真正熟悉它的功能。我以不同的方式尝试了几次,但我没有解决好的结果。当我转到管理页面并手动将选项设置为新问题时,这很完美;当我创建问题并通过 shell 通过命令行运行 for 循环时也是如此,但我想要的是在用户创建问题时自动执行此过程。 对不起,广泛,希望足够清楚! 谢谢您的帮助!! 我在下面分解了我的代码。
models.py
>class Choice(models.Model):
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
def __str__(self):
return self.choice_text
class Question(models.Model):
choice = models.ManyToManyField(Choice)
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField(default=timezone.now)
client = models.ForeignKey(User, on_delete=models.CASCADE)
def __str__(self):
return self.question_text
def get_absolute_url(self):
return reverse('dashboard:detail',kwargs={'pk':self.pk})
signals.py
>@receiver(m2m_changed, sender=Question.choice.through)
def update_question_model(sender, instance, **kwargs):
instance = kwargs.pop('instance', None)
choice_set = Choice.objects.all().values_list('pk',flat=True)
for i in choice_set:
c = Choice.objects.get(pk=i)
instance.choice.add(c)
instance.save()
m2m_changed.connect(update_question_model, sender=Question.choice.through)
views.py
>class ConsignaCreateView(LoginRequiredMixin, CreateView):
model = Question
fields = ['question_text']
def form_valid(self, form):
form.instance.client = self.request.user
return super().form_valid(form)
【问题讨论】: