получить набор запросов с множественным выбором в представлении Django и сохранить его - PullRequest
0 голосов
/ 03 июня 2018

У меня есть поле с множественным выбором с внешним ключом.Я хочу сохранить, какой хранитель посещал учебную сессию, и я хочу перечислить всех хранителей в качестве поля множественного выбора.

class AddAttendance(forms.ModelForm):
attendanceKeeper = Attendance.objects.only("keeper","present").all()
keeperValues = Attendance.objects.values_list("keeper__id", flat=True).distinct()
keeper = forms.ModelMultipleChoiceField(widget=forms.widgets.CheckboxSelectMultiple, queryset=Keeper.objects.filter(id__in=keeperValues, status=1))

class Meta:
    model = Attendance
    fields = ('keeper',)

def __init__(self, *args, **kwargs):
    super(AddAttendance, self).__init__(*args, **kwargs)
    self.initial["keeper"] = Keeper.objects.all()

Однако моя проблема в том, что я не знаком с тем, как обрабатывать набор запросов в представлении.и как пройти через него и сохранить каждый экземпляр со значением True или False.

Я всегда получаю сообщение об ошибке, что нельзя назначить набор запросов

"Attendance.keeper" must be a "Keeper" instance

Можете ли вы помочь мне, какЯ получаю доступ к значениям набора запросов и сохраняю их

def new_attendance(request, team_pk, package_pk):
if request.method == "POST":
    form = AddAttendance(request.POST)
    if form.is_valid():
        for item in form:
            attendance = item.save(commit=False)
            attendance.keeper = get_object_or_404(AddAttendance.keeper)
            attendance.team = get_object_or_404(Team, pk=team_pk)
            attendance.created_date = timezone.now()
            attendance.save()
            return redirect(reverse('select_package', args=[package_pk, team_pk]))
else:
    form = AddAttendance()
return render(request, 'attendance/new_attendance.html', {'form': form})

В конце я хочу сопоставить keeper из набора запросов и сохранить True / False в поле, присутствующем в моей модели

class Attendance(models.Model):
session = models.ForeignKey(Session)
keeper = models.ForeignKey(Keeper)
team = models.ForeignKey(Team)
present = models.BooleanField()
created_date = models.DateTimeField(default=timezone.now)
edited_date = models.DateTimeField(default=timezone.now)

1 Ответ

0 голосов
/ 03 июня 2018

Вам не нужно поле с множественным выбором;Вы хотите один выбор.С каждым объектом посещаемости может быть связан только один хранитель.

Здесь вы делаете кучу странных и ненужных вещей.Вы должны удалить большую часть этого кода и использовать ModelChoiceField, который используется по умолчанию для ForeignKey.Вам также не нужен виджет-флажок, поскольку, опять же, для нескольких вариантов;возможно, подойдет радио-кнопка.

class AddAttendance(forms.ModelForm):
    class Meta:
        model = Attendance
        fields = ('keeper',)
        widgets = {'keeper': forms.RadioSelect}
    # remove the __init__ and the field definitions, you don't need them

...

form = AddAttendance(request.POST)
if form.is_valid():
    attendance = item.save(commit=False)
    attendance.team = get_object_or_404(Team, pk=team_pk)
    attendance.created_date = timezone.now()
    attendance.save()
    return redirect(reverse('select_package', args=[package_pk, team_pk]))

Нет необходимости явно указывать кипер в представлении, поскольку именно так поступает форма.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...