Невозможно вставить значение в поле внешнего ключа Django - PullRequest
0 голосов
/ 04 апреля 2020

Я попытался вставить значение в поля внешнего ключа в django. Но это покажет мне ошибку, подобную этой: - Невозможно назначить «95»: «Catalog.author_id» должен быть экземпляром «Автор». Но когда я пытался вставить с django shell, он не ' не показывать мне ошибки, все работает нормально. Пожалуйста, помогите мне, я приложил мои коды, которые вы можете хорошо понять

Models.py

class Author(models.Model):
    author_id = models.CharField(max_length=50, primary_key=True)
    name = models.CharField(max_length=50)
    city = models.CharField(max_length=50)
    country = models.CharField(max_length=50)

    def __str__(self):
        return str(self.author_id)


class Catalog(models.Model):
    book_id = models.IntegerField(primary_key=True)
    title = models.CharField(max_length=100)
    year_of_publish = models.CharField(max_length=5)
    price = models.IntegerField()
    author_id = models.ForeignKey('Author', on_delete=models.CASCADE, null=True)

    def __str__(self):
        return str(self.book_id)

Forms.py

class Catalog_Details(forms.ModelForm):
book_id = forms.CharField(widget=forms.TextInput(
    attrs={'class': 'form-control',
           'placeholder': 'Enter book id'}
), required=True, max_length=50)

title = forms.CharField(widget=forms.TextInput(
    attrs={'class': 'form-control',
           'placeholder': 'Enter title'}
), required=True, max_length=50)
year_of_publish = forms.CharField(widget=forms.TextInput(
    attrs={'class': 'form-control',
           'placeholder': 'Enter Published Year'}
), required=True, max_length=5)
author_id = forms.ModelChoiceField(queryset=Author.objects.values_list(
    'author_id', flat=True))

price = forms.CharField(widget=forms.TextInput(
    attrs={'class': 'form-control',
           'placeholder': 'Enter Price'}
), required=True, max_length=50)

class Meta():
    model = Catalog
    fields = ['book_id', 'title', 'year_of_publish', 'price', 'author_id']

views.py

@login_required
def catalog(request):
    if request.user.is_authenticated:
        if request.method == 'POST':
            form = Catalog_Details(request.POST)
            if form.is_valid():
                author_id = form.cleaned_data['author_id']
                m = Author.objects.get(author_id=author_id)
                c1 = Catalog(book_id=form.cleaned_data['book_id'], title=form.cleaned_data['title'],
                           year_of_publish=form.cleaned_data['year_of_publish'],price=form.cleaned_data['price'], author_id=m)
                c1.save()
                form = Catalog_Details()

        else:
            form = Catalog_Details()
        return render(request, 'catalog.html', {'form': form})

1 Ответ

0 голосов
/ 04 апреля 2020

Я не думаю, что даже необходимо переопределить поле author_id в формах. Вы можете удалить author_id из Catalog_Details. И вы можете обновить свое представление следующим образом:

@login_required
def catalog(request):
    if request.method == 'POST':
        form = Catalog_Details(request.POST)
        if form.is_valid():
            form.save()
            form = Catalog_Details()
            # here you should redirect to a success page to know `Catalog_Details` has been created
    else:
        form = Catalog_Details()
    return render(request, 'catalog.html', {'form': form})

FYI , вы не должны называть ForeignKey Поля с суффиксом _id, потому что django создает это для вас. Например: в вашем случае вы найдете поле author_id_id в модели Catalog, которое будет возвращать целочисленное значение (первичный ключ столбца таблицы Author).

...