python - Django POST 错误 : tuple has no attribute get, 尽管之前有类似的代码

标签 python django

我正在开发一个页面,该页面使用 Django 模型中的数据自动填充 html 下拉列表,然后在提交时将该数据发送到另一个页面,该页面将使用它来执行操作。我已填充 html 下拉列表,但在发布到另一个页面时遇到问题。我不断得到

"AttributeError at /battleSim/ 'tuple' object has no attribute '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>

模型.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 应该正确路由到 postget .

关于python - Django POST 错误 : tuple has no attribute get, 尽管之前有类似的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59182214/

相关文章:

python - 如何将嵌套列表中的 collections.defaultdict(list) 的结果输出到 jinja 中?

python - 为什么nose2不通过pip安装nosetests?

python - 使用 to_datetime 转换日期

python - 如何编写从 zip 文件创建 InMemoryUploadedFile 的 python 测试?

python - runningslserver 命令在 django 中无法使用 pyinstaller 构建的可执行文件运行

python - 在使用 pd.pivot_table 制作的散点图中为每个类设置不同的颜色

python - python脚本中的mysql编码问题

javascript - 如何将 csv 文件从 django 中的静态加载到 javascript 函数中

python - ModelFormSet 上的额外表单

django - Internet Explorer 不与 django 开发服务器通信