Я очень новичок как 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)