Django 2.2 ошибка - ошибка целостности, ограничение NOT NULL не выполнено - PullRequest
0 голосов
/ 03 мая 2020

У меня есть пример проекта Django 2.2, у которого есть панель поиска в верхнем правом углу панели навигации (взято из Bootstrapers):

navbar. html :

<nav class="navbar navbar-expand-lg navbar-light bg-light">
<a class="navbar-brand" href="/">Navbar</a>
 <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
   <span class="navbar-toggler-icon"></span>
  </button>

 <div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav mr-auto">
  <li class="nav-item active">
    <a class="nav-link" href="/">Home <span class="sr-only">(current)</span></a>
  </li>

{% if user.is_authenticated %}

 <li class="nav-item">
    <a class="nav-link" href="/search/">Search</a>
  </li>
   ...  
 {% endif %}

  <li class="nav-item">
    <a class="nav-link" href="/a/">A</a>
  </li>
  <li class="nav-item">
    <a class="nav-link" href="/b/">B</a>
  </li>

  </ul>
  <form class="form-inline my-2 my-lg-0" action = '/search/'>
  <input class="form-control mr-sm-2" type="search" name="q" placeholder="Search" aria-label="Search">
  <button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>
 </form>
 </div>
</nav>

Возвращает «Вы искали [аргумент поиска]» по URL '/ search /' и работает нормально. Я хотел бы перенести его из навигационной панели в меню «Поиск» в навигационной панели. У меня есть следующее:

search / models.py

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

 # Create your models here.
 class SearchQuery(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, blank = True, null=True, on_delete=models.SET_NULL)
 query = models.CharField(max_length=220)
 timestamp = models.DateTimeField(auto_now_add=True)

search / views.py :

  from django.shortcuts import render
  from django.contrib.auth.decorators import login_required
  from django.contrib.admin.views.decorators import staff_member_required

  from .models import SearchQuery

  # Create your views here.
  @login_required
  @ staff_member_required
  def search_view(request):
    query = request.GET.get('q', None)
    user = None
    if request.user.is_authenticated:
       user = request.user
    SearchQuery.objects.create(user=user, query=query)
    context = {"query": query}
    return render(request, 'searches/view.html',context)

поиски / шаблоны / поиски / просмотр. html:

  {% extends "base.html" %}


 {% block content %}

{% if user.is_authenticated %}

<form action = '/search/'>
  <input type="search" name="q" aria-label="Search">
  <button type="submit">Search</button>
</form>

<div class='row'>
   <div class='col-12 col-8 mx-auto'>
    <p class='lead'>You searched for {{ query }}</p>
</div>

</div>

{% endif %}

{% endblock %}

Когда я выполняю поиск из панели поиска в навигационной панели, он возвращает аргумент. Но когда я хочу запустить поиск из панели поиска и нажать на вкладку Поиск, я получаю следующее:

   IntegrityError at /search/
   NOT NULL constraint failed: searches_searchquery.query
   ...
    ...searches\views.py in search_view
    SearchQuery.objects.create(user=user, query=query) 

Почему я получаю это?

РЕДАКТИРОВАТЬ :

После внесения этого изменения в search / views.py :

query = request.POST.get('q', None)

Я получаю эту ошибку во время выполнения:

django.db.utils.IntegrityError: NOT NULL constraint failed: searches_searchquery.query

и в браузере:

enter image description here

enter image description here

...