【问题标题】:django cannot find object field. error: Items() got an unexpected keyword argument 'sellbtn'django 找不到对象字段。错误:Items() 得到了一个意外的关键字参数“sellbtn”
【发布时间】:2020-05-04 21:00:51
【问题描述】:

我正在尝试访问我的对象,但我创建了一个字段,它告诉我它不存在。

$ cat userdash/views.py

from django.shortcuts import render
from django.http import HttpResponse, HttpResponseRedirect
from .models import AssetList, Items
from .forms import CreateNewTrade

# Create your views here.


#def index(response):
#       return HttpResponse("<h1>Hello Dark World!</h1>")

def userdash(response, id):
        ls = AssetList.objects.get(id=id)
        if response.method == "POST":
                print(response.POST)
                if response.POST.get("save"):
                        for item in ls.items_set.all():
                                if response.POST.get("c" * str(item.id)) == "clicked":
                                        item.sellbtn = True
                                else:
                                        item.sellbtn = False

                                item.save()

                elif response.POST.get("newItem"):
                        txt = response.POST.get("new")
                        if len(txt) > 2: #this validation is retarded and needs to be fixed
                                ls.items_set.create(user_asset=txt, sellbtn=False) #this is the line in question
                        else:
                                print("invalid")


        #items = ls.items_set.get(id=1)
        #return HttpResponse("<h1>User Dashboard!</h1><h2>%s</h2><br></br><p>%s</p>" %(ls.name, str(items.user_asset)))
        return render(response, "userdash/list.html", {"ls":ls})

def home(response):
        #pass
        return render(response, "userdash/home.html", {})

def create(response):
        if response.method == "POST":
                form = CreateNewTrade(response.POST)
                if form.is_valid():
                        n = form.cleaned_data["user_asset"]
                        t = AssetList(name=n)
                        t.save()
                return HttpResponseRedirect("/userdash/%i" %t.id)
        else:
                form = CreateNewTrade()
        return render(response, "userdash/create.html", {"form":form})

$ cat userdash/templates/userdash/list.html

{% extends 'userdash/base.html' %}

{% block title %}
List Page

{% endblock %}



{% block content %}

        <h2>{{ls.name}}</h2>
        <form method="post" action="#">
                {% csrf_token %}
                <ul>
                        {% for item in ls.items_set.all %}
                                {% if item.sell_asset == True %}
                                        <li><input type="checkbox", value="clicked", name="c{{item.id}}" checked>{{item.user_asset}} - SOLD</li>
                                {% else %}
                                        <li><input type="checkbox", value="clicked", name="c{{item.id}}">{{item.user_asset}} - NOT SOLD</li>
                                {% endif %}
                        {% endfor %}
                </ul>
                <button type="submit", name="save", value="save">Save</button>
                <input type="text", name="new">
                <button type="submit", name="newItem", value="newItem">Add Item</button>
        </form>
{% endblock %}

$ cat userdash/forms.py

from django import forms

class CreateNewTrade(forms.Form):
        #form fields are same as models and database
        user_asset = forms.CharField(label="User Asset", max_length=200)
        sellbtn = forms.BooleanField(required=False)

$ cat userdash/models.py

from django.db import models

# Create your models here.

class AssetList(models.Model):
        name = models.CharField(max_length=200)

        def __str__(self):
                return self.name

class Items(models.Model):
        currencylist = models.ForeignKey(AssetList, on_delete=models.CASCADE)
        user_asset = models.CharField(max_length=300)
        sell_asset = models.BooleanField()

        def __str__(self):
                return self.user_asset

错误:

TypeError at /userdash/3

Items() got an unexpected keyword argument 'sellbtn'

Request Method:     POST
Request URL:    http://192.168.42.14:8081/userdash/3
Django Version:     3.0.5
Exception Type:     TypeError
Exception Value:    

Items() got an unexpected keyword argument 'sellbtn'

Exception Location:     /home/piggy/Env/lib/python3.7/site-packages/django/db/models/base.py in __init__, line 500
Python Executable:  /usr/local/bin/uwsgi
Python Version:     3.7.3
Python Path:    

['.',
 '',
 '/home/piggy/Env/lib/python37.zip',
 '/home/piggy/Env/lib/python3.7',
 '/home/piggy/Env/lib/python3.7/lib-dynload',
 '/usr/lib/python3.7',
 '/home/piggy/Env/lib/python3.7/site-packages']

Server time:    Mon, 4 May 2020 20:46:11 +0000

如何访问我的对象中的 sellbtn 字段?

额外问题:

像这样调试时显示对象内容的最简单方法是什么?

【问题讨论】:

    标签: python django django-forms django-templates


    【解决方案1】:

    这是因为 for 循环中的 itemItems 模型的一个实例,它没有实现 sellbtn 字段

    如果我们仔细观察模型定义,我们会发现它只实现了 3 个字段:

    class Items(models.Model):
        currencylist = models.ForeignKey(AssetList, on_delete=models.CASCADE)
        user_asset = models.CharField(max_length=300)
        sell_asset = models.BooleanField()
    

    但是,sellbtn 是您的 CreateNewTrade 表单上的一个字段。

    不确定您要在这里做什么,或者为什么要在您的 Item 对象上设置类似 sellbtn 的内容。但这就是您的应用崩溃的原因。

    【讨论】:

    • 谢谢!就是这样。
    猜你喜欢
    • 1970-01-01
    • 2020-05-14
    • 2016-12-08
    • 1970-01-01
    • 1970-01-01
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    • 2017-05-10
    相关资源
    最近更新 更多