Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django KeyError:如何正确设置形式为_invalid()的变量_Django_Django Forms - Fatal编程技术网

Django KeyError:如何正确设置形式为_invalid()的变量

Django KeyError:如何正确设置形式为_invalid()的变量,django,django-forms,Django,Django Forms,作为介绍,我知道我在views.py中的search_text=form.cleaned_data['search_text']行中做了一些错误的事情,但我不知道如何在form_invalid中正确设置该变量 问题 如果用户以数据库中已存在的形式输入搜索文本,则会导致错误:具有此搜索文本的哈希标记已存在 解决方案 如果用户输入的搜索文本已存在于数据库中,请检查输入的搜索文本是否与数据库中现有的搜索文本匹配。如果是,请呈现results.html 错误 密码 models.py forms.py

作为介绍,我知道我在views.py中的search_text=form.cleaned_data['search_text']行中做了一些错误的事情,但我不知道如何在form_invalid中正确设置该变量

问题 如果用户以数据库中已存在的形式输入搜索文本,则会导致错误:具有此搜索文本的哈希标记已存在

解决方案 如果用户输入的搜索文本已存在于数据库中,请检查输入的搜索文本是否与数据库中现有的搜索文本匹配。如果是,请呈现results.html

错误 密码 models.py

forms.py

views.py

改为:

def form_invalid(self, form):
    search_text = form.cleaned_data['search_text']
    if Hashtag.objects.filter(pk=search_text).exists():
        return HttpResponseRedirect(reverse('mapping_twitter:results'))
    else:
        return self.form_invalid(form)

form.u数据是在form可用后创建的。因此,当表单为invaild form.u时,数据为None

import re

from django.db import models
from twython import Twython


class Location(models.Model):
    """ Model representing a Location (which is attached to Hashtag objects
    through a M2M relationship) """

    name = models.CharField(max_length=1400)

    def __str__(self):
        return self.name


class Hashtag(models.Model):
    """ Model representing a specific Hashtag serch by user """

    search_text = models.CharField(max_length=140, primary_key=True)
    locations = models.ManyToManyField(Location, blank=True)

    def __str__(self):
        """ String for representing the Model object (search_text) """
        return self.search_text

    def display_locations(self):
        """ Creates a list of the locations attached to the Hashtag model """
        return list(self.locations.values_list('name', flat=True).all())
from django import forms
from django.forms import ModelForm
from django.utils.translation import ugettext_lazy as _

from .models import Location, Hashtag


class SearchHashtagForm(ModelForm):
    """ ModelForm for user to search by hashtag """

    def clean_hashtag(self):
        data = self.cleaned_data['search_text']
        # Check search_query doesn't include '#'. If so, remove it.
        if data[0] == '#':
            data = data[1:]
        # return the cleaned data
        return data

    class Meta:
        model = Hashtag
        fields = ['search_text',]
        labels = {'search_text':_('Hashtag Search'), }
        help_texts = { 'search_text': _('Enter a hashtag to search.'), }
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import get_object_or_404, render
from django.urls import reverse
from django.views import generic
from django.views.generic.edit import FormView

from .models import Location, Hashtag
from .forms import SearchHashtagForm


class HashtagSearch(FormView):
    """ FormView for user to enter hashtag search query """

    template_name = 'mapping_twitter/hashtag_search_form.html'
    form_class = SearchHashtagForm

    def get_success_url(self):
        return reverse('mapping_twitter:results')

    def form_valid(self, form):
        form.clean_hashtag()
        form.save()
        return super().form_valid(form)

    def form_invalid(self, form):
        search_text = form.cleaned_data['search_text']
        if Hashtag.objects.filter(pk=search_text).exists():
            return HttpResponseRedirect(reverse('mapping_twitter:results'))
        else:
            return self.form_invalid(form)


class SearchResultsView(generic.ListView):
    """ Generic class-based view listing search results of locations """
    model = Hashtag
    template_name = 'mapping_twitter/results.html'

    def get_queryset(self, **kwargs):
        qs = super().get_queryset()
        return qs

    def get_context_data(self, **kwargs):
        context = super(SearchResultsView, self).get_context_data(**kwargs)
        context['search_text'] = Hashtag.objects.all()
        return context
def form_invalid(self, form):
    search_text = form.cleaned_data['search_text']
    if Hashtag.objects.filter(pk=search_text).exists():
        return HttpResponseRedirect(reverse('mapping_twitter:results'))
    else:
        return self.form_invalid(form)
def form_invalid(self, form):
    search_text = self.request.POST.get('search_text')
    if search_text and Hashtag.objects.filter(pk=search_text).exists():
        return HttpResponseRedirect(reverse('mapping_twitter:results'))
    else:
        return super(HashtagSearch, self).form_invalid(form)