我目前正在进行一个正在开发中的项目。现在我从来没有和Django共事过,现在我遇到了一些麻烦。
我正在尝试将一些表单字段保存到sqlite数据库中,但是我得到了错误。
这是我得到的错误
ValueError at /recipes
The view brewery.views.recipes didn't return an HttpResponse object. It returned None instead.
Request Method: POST
Request URL: http://localhost:8000/recipes
Django Version: 4.0.2
Exception Type: ValueError
Exception Value:
The view brewery.views.recipes didn't return an HttpResponse object. It returned None instead.
Exception Location: C:\Users\Admin\AppData\Roaming\Python\Python310\site-packages\django\core\handlers\base.py, line 309, in check_response
Python Executable: C:\Program Files\Python310\python.exe
Python Version: 3.10.2
Python Path:
['C:\\Users\\Admin\\Desktop\\praktika\\brew',
'C:\\Program Files\\Python310\\python310.zip',
'C:\\Program Files\\Python310\\DLLs',
'C:\\Program Files\\Python310\\lib',
'C:\\Program Files\\Python310',
'C:\\Users\\Admin\\AppData\\Roaming\\Python\\Python310\\site-packages',
'C:\\Program Files\\Python310\\lib\\site-packages',
'/home/ponasniekas/wwwpi/brew',
'/home/ponasniekas/wwwpi/brew/brew',
'/home/ponasniekas/wwwpi/brew/brew/brewery',
'/home/ponasniekas/.local/lib/python3.8/site-packages']
以下是我的视图文件:
from django.http import HttpResponse
import json
from django.http import StreamingHttpResponse
from django.shortcuts import render
from django.core.serializers import serialize
from django.http import JsonResponse
from django.template import RequestContext
from .models import StockYeast, queryset_to_indexlist,queryset_to_array, Brew, Fermentable, Miscs, RecipeYeast, Recipes, Yeast,StockFermentables
from .models import Hop,StockHop,StockMiscs
from .forms import RecipeForm, RecipeFermentableForm, RecipeHopForm, RecipeMiscForm,RecipeWaterForm, RecipeYeastForm,RecipeMashForm, StockMiscForm
from .forms import StockFermentableForm,StockHopForm,StockYeastForm, StockMiscForm
from django.forms import formset_factory
def index(request):
return render(request, 'index.html')
def recipes(request):
if request.method == 'POST':
recipes = RecipeForm(request.POST)
if form.is_valid():
n = form.cleaned_data["name"]
t = Recipes(name=n)
t.save()
else:
recipes = Recipes.objects.all()
recipeFermentableFormset = formset_factory(RecipeFermentableForm, extra=1)
recipeHopFormset = formset_factory(RecipeHopForm, extra=1)
RecipeMiscFormSet= formset_factory(RecipeMiscForm, extra=1)
RecipeYeastFormSet = formset_factory(RecipeYeastForm,extra=1)
RecipeMashFormSet = formset_factory(RecipeMashForm,extra=1)
context = {
"recipes" : recipes,
"recipe_form" : RecipeForm(auto_id="recipe_%s"),
"recipe_fermentableformset":recipeFermentableFormset(prefix='fermentable'),
"recipe_hopformset":recipeHopFormset(prefix='hop'),
"recipe_miscformset":RecipeMiscFormSet(prefix='misc'),
"recipe_yeastformset":RecipeYeastFormSet(prefix='yeast'),
"recipe_mashformset" :RecipeMashFormSet(prefix='mash'),
"recipeWaterForm":RecipeWaterForm()
}
return render(request, 'recipes.html', context)
这是我的recipes.html文件:
{% block content %}
<!-- Modal -->
<div class="card shadow-sm">
<div class="card-header" id="headingOne">
<h5 class="mb-0"> Receptas</h5>
</div>
<div id="card-base" class="collapse show" aria-labelledby="headingOne" data-parent="#accordion">
<div class="card-body">
<div class="row">
<div class="col">
<form method="post" action="/recipes">
{% csrf_token %}
{{recipe_form.ibu}}
{{recipe_form.abv}}
<div class="row">
<div class="col">{{recipe_form.name|as_crispy_field}}</div>
<div class="col">{{recipe_form.style|as_crispy_field}}</div>
</div>
<div class="row">
<div class="col">{{recipe_form.batch_size|as_crispy_field}}</div>
<div class="col">{{recipe_form.boile_time|as_crispy_field}}</div>
<div class="col">{{recipe_form.efficiency|as_crispy_field}}</div>
</div>
<div class="row">
<div class="col">{{recipe_form.primary_age|as_crispy_field}}</div>
<div class="col">{{recipe_form.secondary_age|as_crispy_field}}</div>
<div class="col">{{recipe_form.age|as_crispy_field}}</div>
</div>
<div class="row">
<div class="col">{{recipe_form.pub_date|as_crispy_field}}</div>
</div>
<div class="row">
<div class="col">{{recipe_form.notes|as_crispy_field}}</div>
</div>
</div>
<span class="d-flex flex-row-reverse"><button class="btn btn-secondary" id="save_recipe_btn"
type="submit"><i class="bi bi-save"></i></br> Saugoti</button></span>
</form>
</div>
</div>
</div>
</div>
{% endblock %}
这是我的models.py文件:
class Recipes(models.Model):
name = models.CharField(max_length=120, default='')
pub_date = models.DateTimeField('date published')
style = models.CharField(max_length=200, default='')
brewer = models.CharField(max_length=100, default='')
type = models.CharField(max_length=20, default='All Grain')
version = models.CharField(max_length=20, default='1')
batch_size = models.DecimalField(decimal_places=2, max_digits=8, default=0.0)
boil_size = models.DecimalField(decimal_places=2, max_digits=8, default=0.0)
boil_time = models.DecimalField(decimal_places=1, max_digits=4, default=0.0)
efficiency = models.DecimalField(decimal_places=1, max_digits=4, default=75.0)
ibu = models.DecimalField(decimal_places=1, max_digits=4, default=0.0)
abv = models.DecimalField(decimal_places=2, max_digits=4, default=0.0)
notes = models.TextField(default='')
carbonation = models.DecimalField(decimal_places=2, max_digits=4, default=0.0)
primary_age = models.DecimalField(decimal_places=1, max_digits=4, default = 0)
secondary_age = models.DecimalField(decimal_places=1, max_digits=4, default = 0)
age = models.DecimalField(decimal_places=1, max_digits=4, default = 0)
__fermentables = []
@classmethod
def create(cls,attr):
recipe = cls()
# do something with the book
for k in Recipes._meta.fields:
if k.name in attr:
setattr(recipe,k.name,attr[k.name])
return recipe
@classmethod
def addFermentables(self,items):
for itm in items:
self.__fermentables.append(itm)
return self.__fermentables
@classmethod
def addHops(self,items):
for i in items:
return i
@classmethod
def addYeast(self,items):
for i in items:
return i
@classmethod
def addMashStep(self,items):
for i in items:
return i
class RecipeFermentable(models.Model):
recipe = models.ForeignKey(Recipes, on_delete=models.CASCADE)
name = models.CharField(max_length=200, default='')
amount = models.DecimalField(decimal_places=2, max_digits=8, default=0.0)
extract = models.DecimalField(decimal_places=1, max_digits=8, default=0.0)
type = models.CharField(max_length=20, default='')
color= models.DecimalField(decimal_places=1, max_digits=8, default=0.0)
fermentable = models.ForeignKey(Fermentable, on_delete=models.RESTRICT)
def create(cls, attr, recipes):
fermentables = cls()
# do something with the book
for k in RecipeFermentable._meta.fields:
if k.name in attr:
setattr(recipe,k.name,attr[k.name])
return fermentables
class RecipeHops(models.Model):
recipe = models.ForeignKey(Recipes, on_delete=models.CASCADE)
name = models.CharField(max_length=200, default='')
alpha = models.DecimalField(decimal_places=1, max_digits=4, default=0.0)
amount = models.DecimalField(decimal_places=2, max_digits=8, default=0.0)
use = models.CharField(max_length=10, default='')
hop = models.ForeignKey(Hop, on_delete=models.RESTRICT)
time = models.DecimalField(decimal_places=1, max_digits=4, default=0.0)
这是我的表单文件:
from django import forms
from tempus_dominus.widgets import DatePicker
from .models import Fermentable, Hop, Yeast, Miscs,queryset_to_indexlist
from django.db import models
import json
import datetime
class RecipeForm(forms.Form):
recipe = forms.CharField(widget=forms.HiddenInput())
ibu = forms.CharField(widget=forms.HiddenInput())
abv = forms.CharField(widget=forms.HiddenInput())
name = forms.CharField(label="Recepto pavadinimas",
widget=forms.TextInput(attrs={}),
max_length=80,
required=True,
localize=False,
disabled=False,
help_text="")
style = forms.CharField(label="Stilius",
widget=forms.TextInput(attrs={}),
max_length=80,
required=True,
localize=False,
disabled=False,
help_text="")
pub_date = forms.DateField(label="Data:",
initial = datetime.datetime.today,
widget = DatePicker(
options={
'minDate': '2009-01-01',
'maxDate': '2050-12-31',
},)
)
batch_size = forms.CharField(label="Kiekis:",
widget=forms.TextInput(attrs={}),
max_length=80,
initial="1000",
required=True,
localize=False,
disabled=False,
help_text="")
efficiency = forms.CharField(label="Efektyvumas",
widget=forms.TextInput(attrs={}),
max_length=80,
initial="85",
required=True,
localize=False,
disabled=False,
help_text="")
boile_time = forms.CharField(label="Virimo laikas",
widget=forms.TextInput(attrs={}),
max_length=80,
initial="90",
required=True,
localize=False,
disabled=False,
help_text="")
carbonation = forms.CharField(label="Virimo laikas",
widget=forms.TextInput(attrs={}),
max_length=80,
initial="90",
required=True,
localize=False,
disabled=False,
help_text="")
primary_age = forms.CharField(label="Fermentacijos laikas (I)", widget=forms.TextInput(attrs={}))
secondary_age = forms.CharField(label="Fermentacijos laikas (II)", widget=forms.TextInput(attrs={}))
age = forms.CharField(label="Brandinimo laikas", widget=forms.TextInput(attrs={}))
notes = forms.CharField(label="Pastabos", widget=forms.TextInput(attrs={}))
当我看一些教程的时候,我做了所有的事情,我觉得我做的一切都是正确的,但是,它似乎不起作用。
有人能告诉我我在这里做错了什么吗?请记住,这将是一个与食谱和累加,累犯等多对一的关系。然而,首先,我只想保存菜谱的基本部分。
发布于 2022-03-09 16:57:31
您的views.py
中有错误
def recipes(request):
if request.method == 'POST':
form = RecipeForm(request.POST) <------ change recipes to form or use recipes in below form valid and cleaned_data
if form.is_valid():
n = form.cleaned_data["name"]
t = Recipes(name=n)
t.save()
现在我在/recipes上得到了一个不同的错误
ValueError
这意味着在保存菜谱之后,您还没有返回任何HttpResponse
。因此,在成功创建了食谱数据之后,可以在任何地方返回HttpResponse
或redirect
。
from django.http import HttpResponse
def recipes(request):
if request.method == 'POST':
form = RecipeForm(request.POST)
if form.is_valid():
n = form.cleaned_data["name"]
t = Recipes(name=n)
t.save()
# Return a "created" (201) response code.
return HttpResponse('Recipe Saved Sucessfully', status=201)
如果您不想在表单验证之后添加任何内容,那么可以直接将数据保存为
if form.is_valid():
form.save()
# Return a "created" (201) response code.
return HttpResponse('Recipe Saved Sucessfully', status=201)
https://stackoverflow.com/questions/71413070
复制相似问题