【问题标题】:Django POST error: tuple has no attribute get, despite similar code working previouslyDjango POST 错误:元组没有属性 get,尽管以前有类似的代码工作
【发布时间】: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=,见编辑。

标签: python django


【解决方案1】:

您的 post 函数返回一个 2 元组,并且 不 将上下文传递给渲染函数。应该是:

return render(
    request,
    'battle.html',
    {'characterID': characterID, 'monsterID': monsterID}
)

不是:

return (render(
        request,
        template_name ='battle.html'
    ),
    {'characterID': characterID, 'monsterID': monsterID}
)

你使用了很多括号。在 Python 中,简单的if 语句等通常不使用方括号。所以虽然没有错,但写if request.method == 'POST' 比写if <s>(</s>request.method == 'POST'<s>)</s>: 更惯用。

请注意,您还需要实现else 案例,因为post 方法应始终返回响应。然而,这里request.method == 'POST' 检查是不是必要的,因为Django 的基于类的视图应该正确路由到post 和get。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-04
    • 2020-12-11
    • 1970-01-01
    • 2014-07-14
    • 2017-11-12
    相关资源
    最近更新 更多