保存表单并重定向到Django中的新URL

时间:2016-04-26 14:56:59

标签: python django database forms

我正在使用django创建一个项目,并且遇到了一些基本问题,我的目标是在主页上添加搜索框。输入搜索词时,服务器从各种API中收集数据,将数据保存到数据库,然后将用户定向到显示此数据的结果页面。

到目前为止,我已设法创建一个采用搜索词并将数据保存到数据库的页面。但是,如果我尝试重定向到新页面,它会中断,特别是数据不会保存到数据库中。我很难找到下一步该做什么的信息。

我有一个模特:

class film(models.Model):
    filmName = models.CharField(primary_key=True, max_length=120)
    quotient = models.FloatField()
    rating = models.FloatField()
    gross = models.IntegerField()
    star = models.CharField(max_length=120)
    releaseDate = models.DateField()

    def __unicode__(self):
        return self.filmName

使用表格:

class searchFilm(forms.ModelForm):
    class Meta:
        model = film
        fields = ['filmName']

两种观点方法:

def home(request):
    title = "Culturnomicon"
    form = searchFilm(request.POST or None)
    if form.is_valid():
        searchedFilm = form.save(commit = False)

        fixedName = searchedFilm.filmName.replace(' ', '+')

        url = 'http://api.themoviedb.org/3/search/movie?api_key=APIKEY&query='+fixedName

        urlRequest = Request(url)

        try:
            reponse = urlopen(urlRequest)
            filmData = reponse.read()
            parsed_json = json.loads(filmData)
        except URLError, e:
            print "didnt work"

        firstResult = parsed_json['results'][0]

        filmId = str(firstResult['id'])

        filmData = getFilmData(filmId)



        if parsed_json['total_results'] != 0:
            searchedFilm = saveFilm(searchedFilm, filmData)
            searchedFilm.save()


    context = {
    "template_title": title,
    "form": form,
    }




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

def results(request):

    return render(request, "results.html", {})

和模板:

        <form method="POST" action="{% url 'results' %}">
            {{form}}
            {% csrf_token %}
            <input type="submit" value ="Search" class = 'btn'/>
        </form>

对于下一步该怎么做的任何建议都将不胜感激。

我也觉得拥有收集API信息的方法可能是一个坏主意,这样做是不是很糟糕,如果是这样,我该如何解决?

1 个答案:

答案 0 :(得分:0)

如果你真正想做的只是加载一个不同的模板,那么你不需要有一个单独的视图,你只需在return render(..."results.html"语句后面移动if form.is_valid() 39;已完成数据库所需的一切。

您可能需要扩展渲染调用以包含一些关于该模板应该实际显示的结果的上下文数据。

如果你想要一个单独的视图,那么你需要将表单的处理移动到另一个视图。

def home(request):
    title = "Culturnomicon"
    form = searchFilm(request.POST or None)
    if form.is_valid():
        # Your logic
        return render(request, "results.html", {})

    context = {
    "template_title": title,
    "form": form,
    }

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