【发布时间】:2019-12-04 18:02:23
【问题描述】:
我正在处理一个页面,该页面使用来自 Django 模型的数据自动填充 html 下拉列表,然后在提交时,将该数据发送到另一个页面,该页面将使用它。我填充了 html 下拉列表,但在发布到另一个页面时遇到问题。我不断得到
"/battleSim/ 'tuple' 对象的 AttributeError 没有属性 'get'
尽管我的 characterCreator 模板中有类似的代码,但这是我的错误。一旦我尝试导航到开发服务器上的battleSim.html,我就会收到此错误,尽管事实上它不应该在 POST 方法运行之前尝试。 (我认为?)以下是相关代码:
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>
models.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中运行“get”函数,用数据库中的数据填充下拉列表,现在正在工作,然后点击“提交”,发布数据以便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})
【问题讨论】:
-
你应该去掉
template_name=,见编辑。