【问题标题】:How to link fixed choices to new created questions in django如何将固定选择链接到 django 中新创建的问题
【发布时间】: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)

【问题讨论】:

    标签: python django model m2m


    【解决方案1】:

    我找到了一种使用 post_save 信号的方法。 如果这对任何人都有帮助,我会分解代码。

    @receiver(post_save, sender=Question)
    def update_question_model(sender, instance, **kwargs):
    q = Question.objects.get(pk=instance.pk)
    choice_set = Choice.objects.all().values_list('pk', flat=True)
    for i in choice_set:
        c = Choice.objects.get(pk=i)
        q.choice.add(c)
        post_save.disconnect(update_question_model, sender=Question)
        q.save()
        post_save.connect(update_question_model, sender=Question)
    

    我仍然想知道这是否可以通过 m2m_changed 信号以更简单的方式完成??

    【讨论】: