Django3.0.1: после использования ForeignKey покажите эту проблему - это поле не может быть пустым - PullRequest
0 голосов
/ 06 января 2020

Django3.0.1: после использования ForeignKey покажите эту проблему - Это поле не может быть пустым.

Я использую Django 3.0.1 и MySQL database.

I Прикрепил код ниже - в models.py, views.py, forms.py

models.py:

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

# Create your models here.
User = settings.AUTH_USER_MODEL

class BlogPost(models.Model):
    user    = models.ForeignKey(User, default=1, blank=True, null=True, on_delete=models.SET_NULL)
    title   = models.CharField(max_length=120)
    slug    = models.SlugField(unique=True)
    content = models.TextField(null=True, blank=True)

views.py:

from django.contrib.auth.decorators import login_required
from django.contrib.admin.views.decorators import staff_member_required
from django.http import Http404
from django.shortcuts import render, get_object_or_404
from .models import BlogPost
from .forms import BlogPostForm, BlogPostModelForm

# Create your views here.
# @login_required
@staff_member_required
def blog_post_create_view(request):
    # create objects - but how
    # ? use a form
    form = BlogPostModelForm(request.POST or None)
    if form.is_valid():
        post = form.save(commit=False)
        post.user = request.user
        post.save()
        form = BlogPostModelForm()
    template_name = 'blog/create.html'
    context = {
        'form': form,
    }
    return render(request, template_name, context)

forms.py:

from django import forms
from .models import BlogPost


class BlogPostForm(forms.Form):
    title    = forms.CharField(max_length=120)
    slug     = forms.SlugField()
    content  = forms.CharField(widget=forms.Textarea)


class BlogPostModelForm(forms.ModelForm):
    class Meta:
        model = BlogPost
        fields = ['title', 'slug', 'content']

    def clean_title(self, *args, **kwargs):
        title = self.cleaned_data.get('title')
        post_title = BlogPost.objects.filter(title=title)
        if post_title.exists():
            raise forms.ValidationError("This title has already been used. Please try again.")
        return

(терминальные) миграции уже выполнены:

(venv)
fahim@Lenovo-IP320 MINGW64 /d/(G)/Python/try_django3.0
$ py manage.py makemigrations
No changes detected
(venv)
fahim@Lenovo-IP320 MINGW64 /d/(G)/Python/try_django3.0
$ py manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, blog, contenttypes, sessions
Running migrations:
  No migrations to apply.
(venv)
fahim@Lenovo-IP320 MINGW64 /d/(G)/Python/try_django3.0
$

создать. html:

{% extends 'index.html' %}

{% block title %}
    Create New Post
{% endblock %}

{% block content %}

{% if title %}
    <h1>{{ title }}</h1>
{% endif %}

<form action="." method="post" enctype="multipart/form-data"> {% csrf_token %}
    {{ form.as_p }}
    <button class="btn btn-success" type="submit">Send</button>
</form>

{% endblock %}

проблема: Это поле не может быть пустым.

1 Ответ

2 голосов
/ 06 января 2020

clean_<field> методы должны возвращать очищенное / проверенное значение

def clean_title(self, *args, **kwargs):
    title = self.cleaned_data.get('title')
    post_title = BlogPost.objects.filter(title=title)
    if post_title.exists():
        raise forms.ValidationError("This title has already been used. Please try again.")
    return title
...