Python 如何在django中将固定选项链接到新创建的问题

Python 如何在django中将固定选项链接到新创建的问题,python,django,model,m2m,Python,Django,Model,M2m,作为django开发者,我是个新手,我正在尝试构建一个排名靠前的web应用程序。 我想做的是,一旦用户通过一个简洁的表单创建了一个新问题,自动更改m2m模型,并将新问题与选项联系起来。这些选项是从1到5的固定等级,用户不能操纵它们,也不能在问题创建表单上显示 从我所读到的内容来看,我猜这个操作可以通过m2m_更改信号(或post_保存,不确定)来完成,但我对它的功能不是很熟悉。我尝试了好几次不同的方法,但都没有取得好的效果。当我进入管理页面,手动设置新问题的选项时,效果非常好;当我通过shell

作为django开发者,我是个新手,我正在尝试构建一个排名靠前的web应用程序。 我想做的是,一旦用户通过一个简洁的表单创建了一个新问题,自动更改m2m模型,并将新问题与选项联系起来。这些选项是从1到5的固定等级,用户不能操纵它们,也不能在问题创建表单上显示

从我所读到的内容来看,我猜这个操作可以通过m2m_更改信号(或post_保存,不确定)来完成,但我对它的功能不是很熟悉。我尝试了好几次不同的方法,但都没有取得好的效果。当我进入管理页面,手动设置新问题的选项时,效果非常好;当我通过shell创建问题并通过命令行运行for循环时,情况也是如此,但我想要的是在用户创建问题时自动化这个过程。 对不起,太多了,希望能说清楚! 谢谢你的帮助!! 我把代码分解到下面

models.py signals.py views.py
我已经找到了一种使用post_保存信号的方法。 如果这对任何人都有帮助,我会分解代码

@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_改变信号,是否可以以更简单的方式实现这一点

@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)
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)
@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)