Как присвоить значение поля одной модели полю другой модели? - PullRequest
1 голос
/ 01 апреля 2020

Скажем, у меня есть функция просмотра, которая создает объект Vacancy при сохранении формы, и она имеет поле company, которое, если форма действительна, должно быть присвоено со значением поля name, то есть на другой модели с именем EmployerProfile, как я могу это сделать? У меня company в качестве внешнего ключа для моей модели.

Мои модели

class EmployerProfile(models.Model):
    name = models.CharField(max_length = 64)
    description = models.TextField()
    username = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete = models.CASCADE)

class Vacancy(models.Model):
    name = models.CharField(max_length = 64)
    competences = models.CharField(max_length = 32)
    salary = models.DecimalField(decimal_places = 2, max_digits = 10)
    description = models.TextField(null = True)
    company = models.ForeignKey(EmployerProfile, on_delete = models.CASCADE)
    featured = models.BooleanField(default = False)

Мой взгляд

@login_required(login_url = 'login')
def vacancyAddView(request):
    if request.method == 'POST':
        form = VacancyAddForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('profile')
    else:
        form = VacancyAddForm()
    context = {
        'form':form
    }

    return render(request, "addVacancy.html", context)

Моя форма

class VacancyAddForm(forms.ModelForm):
    class Meta:
        model = Vacancy
        fields = [
            'name',
            'competences',
            'description',
            'salary',
        ]

PS Я пытался добавить этот фрагмент кода на мой взгляд, сразу после form.is_valid():

obj = EmployerProfile.objects.get(username = request.user)
form.instance.company = obj.name

, но это не так не работает, он вернул ValueError с текстом "Vacancy.company" must be a "EmployerProfile" instance.

PPS Я также попытался переопределить метод save в моей модели, например,

def save(self, *args, **kwargs):
    self.company = self.EmployerProfile.name
    super(Vacancy, self).save(*args, **kwargs) 

, но это не так тоже не работает.

Ответы [ 2 ]

2 голосов
/ 01 апреля 2020

Ты не можешь делать то, что хочешь. Ваша модель вакансии определяет компанию как внешний ключ, но вы пытаетесь установить ее как строку.

class Vacancy(models.Model):
    company = models.ForeignKey(EmployerProfile, on_delete = models.CASCADE)

Однако, вот что вы должны изменить, чтобы работать с вашими моделями, поскольку вы определили их в настоящее время.

@login_required(login_url = 'login')
def vacancyAddView(request):
    if request.method == 'POST':
        form = VacancyAddForm(request.POST)
        if form.is_valid():
            # Set the company
            form.instance.company = request.user.employerprofile
            form.save()
            return redirect('profile')
    else:
        form = VacancyAddForm()
    context = {
        'form':form
    }

    return render(request, "addVacancy.html", context)
0 голосов
/ 01 апреля 2020

Основная проблема c в том, что вы не можете установить поле ForeignKey в качестве строки. Если вы хотите, чтобы пользователь мог указать компанию из формы, у вас есть несколько вариантов. Один из них - взять то, что у вас есть в форме, и использовать его для фильтрации, например, что-то вроде:

company = EmployerProfile.objects.filter(name__iexact=form.cleaned_data['company'])
form.instance.company = company

Другой вариант - изменить форму так, чтобы вместо текстового ввода company был ModelChoiceField , или обычный ChoiceField, заполненный вариантами выбора компании, доступными для пользователя.

В любом случае конечной целью будет обеспечение того, чтобы поле компании содержало внешний ключ к объекту EmployerProfile, а не строковое имя компании.

...