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

Я очень новичок как django разработчик и пытаюсь создать рейтинговое веб-приложение. Я хотел, чтобы пользователь создал новый вопрос с помощью хрустящей формы, автоматически изменил модель m2m и связал этот новый вопрос с выбором. Выборы имеют фиксированный ранг от 1 до 5, и пользователи не могут ими манипулировать, и они не отображаются в форме создания вопроса.

Из того, что я прочитал, я предполагаю, что эта операция может быть выполнена с помощью сигнала m2m_changed (или post_save, не уверен), но я не очень знаком с его функциональностью. Я пробовал несколько раз по-разному, но я не получаю хорошие результаты. Когда я go захожу на страницу администратора и вручную задаю новый вопрос, это работает отлично; То же самое, когда я создаю вопрос и запускаю для l oop из командной строки через оболочку, но я хочу автоматизировать этот процесс, когда вопрос создается пользователями. Извините за обширный, надеюсь, будет достаточно ясно! Спасибо за помощь!! Я разбил свои коды ниже.

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

signal.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)

1 Ответ

0 голосов
/ 01 марта 2020

Я нашел способ сделать это с помощью сигнала 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 ??

...