W moim projekcie Django mam klasę z Manytomanyfield:

class ContestCategory(models.Model):
    name = models.CharField(max_length=70, blank=False, null=False)
    judges = models.ManyToManyField('users.CustomUser', null=True)

Widzę po migracji, że wszystko działało dobrze, a stół jest tworzony. Zrobiłem formularz, aby zmienić takie sędziowie:

class JudgesForm(forms.ModelForm):
    class Meta:
        model = ContestCategory
        fields = ['judges']

    def __init__(self, *args, **kwargs):
        super(JudgesForm, self).__init__(*args, **kwargs)

Moim zdaniem pojawi się formularz i prawidłowo wyświetla wszystkie obiekty Customer, i nie pokazuje błędu podczas zapisywania. Jednak w mojej metodzie post, kiedy to robię:

class SubmissionCategoriesDetailView(LoginRequiredMixin, DetailView):
    model = ContestCategory
    template_name = 'reportes/detail_submission_categories.html'
    form_class = JudgesForm

    def post(self, request, *args, **kwargs):# 1711   5656    2230400    7616
        pk_category = kwargs.get('pk')
        judges = request.POST.get('judges')

        logging.info(str(judges))

        return HttpResponseRedirect(reverse('reportes:submission_categories'))

Dostaję w dziennikach, które "sędziowie" zwraca właściwy identyfikator mojego Customuser, ale tylko wtedy, gdy mam tylko jednego wybranego Customer. Ilekroć wybieram więcej niż jeden, daje mi tylko w "sędziowie" id ostatniego, który został wybrany, a nie wszystkich z nich.

Dlaczego to się dzieje? Czy powinienem użyć innego widgetu niż automatyczny, czy jest coś brakującego z modeli? Wszelka pomoc byłaby doceniona.

1
Iván Flores Vázquez 20 lipiec 2020, 21:42

1 odpowiedź

Najlepsza odpowiedź

Ponieważ {{x0} } [Django-doc] zawsze zwraca jedną wartość. Jeśli chcesz zwrócić Wszystkie wartości , powinieneś skorzystać z {x1}} [Django-doc]:

from django.shortcuts import redirect

class SubmissionCategoriesDetailView(LoginRequiredMixin, DetailView):
    model = ContestCategory
    template_name = 'reportes/detail_submission_categories.html'
    form_class = JudgesForm

    def post(self, request, *args, **kwargs):
        pk_category = kwargs.get('pk')
        judges = request.POST.getlist('judges')

        logging.info(str(judges))

        return redirect('reportes:submission_categories')

Lepiej jest korzystać z formularza do przetwarzania danych:

from django.shortcuts import redirect

class SubmissionCategoriesDetailView(LoginRequiredMixin, DetailView):
    model = ContestCategory
    template_name = 'reportes/detail_submission_categories.html'
    form_class = JudgesForm

    def post(self, request, *args, **kwargs):
        form = JudgesForm(request.POST)
        if form.is_valid():
            logging.info(str(form.cleaned_data['judges']))

        return redirect('reportes:submission_categories')

Możesz spojrzeć na UpdateView [Django-doc] do obsługi logiki kotła.

1
Willem Van Onsem 20 lipiec 2020, 18:50