我正在开发一个页面,该页面使用 Django 模型中的数据自动填充 html 下拉列表,然后在提交时将该数据发送到另一个页面,该页面将使用它来执行操作。我已填充 html 下拉列表,但在发布到另一个页面时遇到问题。我不断得到
尽管类似的代码在我的 characterCreator 模板中工作,但这是我的错误。当我尝试导航到开发服务器上的 BattleSim.html 时,我就会收到此错误,尽管事实上在 POST 方法运行之前不应该尝试这样做。 (我认为?)以下是相关代码:"AttributeError at /battleSim/ 'tuple' object has no attribute 'get'
views.py:
class CharacterCreatorView(TemplateView):
template_name = "characterCreator.html"
# this solution courtesy of Eliakin Costa on StackOverflow: https://stackoverflow.com/a/59112612/12352379
def post(self, request, *args, **kwargs):
userID = 'testUser'
addCharacter(
userID,
str(request.POST.get('characterName')),
str(request.POST.get('race')),
str(request.POST.get('class')),
str(request.POST.get('strength')),
str(request.POST.get('dexterity')),
str(request.POST.get('constitution')),
str(request.POST.get('intelligence')),
str(request.POST.get('wisdom')),
str(request.POST.get('charisma'))
)
return render(request, self.template_name, {})
class battleSimView(TemplateView):
template_name = "battleSim.html"
def get(self, request, *args, **kwargs):
character = characterTable.objects.all() # use filter() when you have sth to filter ;)
monster = monsterTable.objects.all()
return render(request, self.template_name, {'characters':character, 'monsters':monster},)
def post(self, request, *args, **kwargs):
if(request.method == "POST"):
characterID = str(request.POST.get('character_id'))
monsterID = str(request.POST.get('monster_id'))
return(render(request, template_name ="battle.html"), {'characterID': characterID, 'monsterID': monsterID},)
battleSim.html 表单:
<div class="container-fluid">
<form method="POST">
<select name="character_id" id = "character_id">
{% for entry in characters %}
<option value="playerName">{{ entry.playerName }}</option>
{% endfor %}
</select>
<br><br>
<p> VS </p>
</br>
<select name="monster_id" id = "monster_id">
{% for entry in monsters %}
<option value="monsterName">{{ entry.monsterName }}</option>
{% endfor %} <!-- MAKE THIS A GET REQUEST YOU MORON -->
</select>
{% csrf_token %}
<br>
<input type="submit" class="btn" value="Click" name="mybtn">
</form>
</div>
characterCreator.html 表单:
<div id = "formArea">
<form name = "characterForm" id = "characterForm" method = "POST">
{% csrf_token %}
Character Name:<br>
<input type="text" name="characterName" id ="characterName">
<br>
Race:<br>
<select name = "race" id = "race">
<option value = "human"> Human </option>
<option value = "elf"> Elf </option>
<option value = "dwarf"> Dwarf </option>
<option value = "gnome"> Gnome </option>
<option value = "halfling"> Halfling </option>
<option value = "halfElf"> Half-Elf </option>
<option value = "halfOrc"> Half-Orc </option>
</select>
<br>
Class:<br>
<select name = "class" id = "class" onchange="changePic()">
<option value = "fighter"> Fighter </option>
<option value = "rogue"> Rogue </option>
<option value = "wizard"> Wizard </option>
</select>
<br>
Strength:<br>
<input type = "number" name = "strength">
<br>
Dexterity:<br>
<input type = "number" name = "dexterity">
<br>
Constitution:<br>
<input type = "number" name = "constitution">
<br>
Intelligence:<br>
<input type = "number" name = "intelligence">
<br>
Wisdom:<br>
<input type = "number" name = "wisdom">
<br>
Charisma:<br>
<input type = "number" name = "charisma">
<br>
<br><br>
<input type="submit" class="btn" value="Click" name="mybtn">
<br><br>
</form>
</div>
模型.py
from django.db import models
from django.forms import ModelForm
class characterTable(models.Model):
userID = models.CharField(max_length = 32)
playerName = models.CharField(max_length = 32)
race = models.CharField(max_length = 32)
playerClass = models.CharField(max_length = 32)
strength = models.CharField(max_length = 2)
dexterity = models.CharField(max_length = 2)
constitution = models.CharField(max_length = 2)
intelligence = models.CharField(max_length = 2)
wisdom = models.CharField(max_length = 2)
charisma = models.CharField(max_length = 2)
def __str__(self):
return (self.userID + ": " + self.playerName )
class monsterTable(models.Model):
monsterName = models.CharField(max_length = 32)
hp = models.CharField(max_length = 3)
ac = models.CharField(max_length = 3)
special = models.CharField(max_length = 32)
def __str__(self):
return(self.monsterName)
# Create your models here.
理想情况下,在 BattleSim 的页面加载时,它会在 BattleSimView 中运行“获取”功能,用数据库中的数据填充下拉列表(现在正在运行),然后单击“提交”,发布数据,以便 Django 可以渲染将使用提交的数据的下一个 HTML 页面。我不确定为什么在尝试从 BattleSim.html 发布而不是从 characterCreator.html 发布时收到此错误
我知道使用 Django 表单是做事的正确方法,但是考虑到我已经让它与 HTML 表单一起工作了,如果可能的话,我想继续这样做,因为这将是最后提交的表格,也是我唯一遇到问题的表格
编辑:我更新的函数产生语法错误
def post(self, request, *args, **kwargs):
characterID = str(request.POST.get('character_id'))
monsterID = str(request.POST.get('monster_id'))
return render(request, template_name ='battle.html',{'characterID':characterID, 'monsterID':monsterID})
最佳答案
您的post
函数返回一个二元组,并且不将上下文传递给渲染函数。应该是:
return render(
request,
'battle.html',
{'characterID': characterID, 'monsterID': monsterID}
)
不是:
return <s>(</s>render(
request,
template_name ='battle.html'
<s>)</s>,
{'characterID': characterID, 'monsterID': monsterID}
)
您使用了很多括号。在Python中,通常不使用括号来表示简单的if
因此,虽然没有错,但更惯用的写法是 if request.method == 'POST'
,比if <s>(</s>request.method == 'POST'<s>)</s>:
.
请注意,您需要实现 else
情况也是如此,因为 post
方法应始终返回响应。然而这里request.method == 'POST'
检查没有必要,因为 Django 基于类的 View 应该正确路由到 post
和get
.
关于python - Django POST 错误 : tuple has no attribute get, 尽管之前有类似的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59182214/