Djano форма множественного выбора - не может назначить QuerySet, должен быть пользовательский экземпляр - PullRequest
0 голосов
/ 26 мая 2019

Я пытаюсь создать базовый список заданий / заданий. В форме «Создание работы» я пытаюсь добавить возможность «автору» назначать дополнительный персонал для работы через поле множественного выбора из списка зарегистрированных пользователей.

Пока, похоже, работает через форму администратора. Но когда я делаю то же самое на «странице создания задания», я получаю следующую ошибку ValueError:

Невозможно назначить «QuerySet [CustomUser: testuser1, CustomUser: testuser2]»: «Job.personnel» должен быть экземпляром «CustomUser».

Я не уверен, что я делаю неправильно в представлении, я видел похожие темы, но эти варианты либо не работали, либо я просто не понимал решение (я очень плохо знаком с Django / Python в целом).

Буду очень признателен за любую помощь или предложения о том, как это можно улучшить!

Модель работы из приложения для работы

from django.conf import settings
from django.db import models
from user.models import CustomUser

class Job(models.Model):
    """A model for active jobs"""
    job_title = models.CharField(max_length=200)
    author = models.ForeignKey(
        CustomUser, 
        null=True, 
        on_delete=models.SET_NULL, 
        related_name = 'authors'
        )  
    personnel = models.ForeignKey(
        CustomUser,
        null=True, 
        on_delete=models.SET_NULL, 
        related_name = 'addition_personnel'
        )
    job_text = models.TextField()
    created_date = models.DateTimeField(auto_now_add=True)  
    last_update = models.DateTimeField(null=True, auto_now=True) 
    close_date = models.DateField(null=True, blank=True)
    #  Job status choices 
    OPEN = 'Open'
    CLOSED = 'Closed'
    JOB_STATUS_CHOICES = (
        (OPEN, 'Open'),
        (CLOSED, 'Closed')
    )
    job_status = models.CharField(
        choices = JOB_STATUS_CHOICES,
        max_length = 10,
        null = True,
        blank = True,
        default = ''
    )

    def __str__(self):
        return self.job_title

Модель CustomUser из пользовательского приложения

from django.contrib.auth.models import AbstractUser

from django.db import models

class CustomUser(AbstractUser):
    """ custom user model """
    Position = models.CharField(max_length=100, null='', blank = True)

Форма - использует ModelForm с ModelMultipleChoiceField

from django import forms
from .models import Job
from user.models import CustomUser


class JobCreateForm(forms.ModelForm):
    """Create new job form"""
    personnel_queryset = CustomUser.objects.all()
    personnel = forms.ModelMultipleChoiceField(
        queryset=personnel_queryset,  
        widget=forms.CheckboxSelectMultiple(), 
        required=False
        )

    class Meta:
        model = Job
        fields = [
            'job_title',
            'job_text',
            'close_date',
            'job_status',
            'personnel'
        ]

и фрагмент просмотра

def job_create(request):
    """Job create form view"""
    if request.method == 'POST':
        form = JobCreateForm(request.POST)
        personnel = CustomUser.objects.all()
        if form.is_valid():
            new_job = form.save(commit=False)
            new_job.author = request.user
            new_job.personnel = personnel
            new_job.save()  
            return redirect('job_detail', 
                            job_details_id=new_job.pk)
    #  if a GET (or any other mehtod) blank form is created
    else:
        form = JobCreateForm() 
    return render(request, 'jobs/job_create.html', {'form':form})

1 Ответ

0 голосов
/ 27 мая 2019

Я думаю, что я подозревал это / только заставил это работать.

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

Из модели Джобса.

...

personnel = models.ManyToManyField(CustomUser, blank=True)
...

Затем с помощью этой Проблемы с сохранением формы Django: у объекта 'UserProfile' нет атрибута 'save_m2m' и тема о модельных формах и метод сохранения из https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#the-save-method.

Я изменил вид на:

def job_create(request):
    """Job creation view with form"""
    #  if this is a POST request we need to process the form data 
    if request.method == 'POST':
        #  create a form instance and populate it with data from the request:
        form = JobCreateForm(request.POST)
        #  check whether form data is valid:
        personnel = CustomUser.objects.all()
        if form.is_valid():
            #  process the data in the form.cleaned_data as required
            # personnel_inst = CustomUser.objectss
            new_job = form.save(commit=False)
            new_job.author = request.user
            new_job.save()  
            form.save_m2m()
            return redirect('job_detail', job_details_id=new_job.pk)
    #  if a GET (or any other mehtod) blank form is created
    else:
        form = JobCreateForm() 
    return render(request, 'jobs/job_create.html', {'form':form})

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