首页 文章

使用ModelChoiceField查看错误“str不可调用”

提问于
浏览
0

我想为类型为ForeignKey的字段添加Select字段以形成并用于此ModelChoiceField . 但是这种形式不会渲染并抛出错误

“{} {} {}”行中的“'str'对象不可调用”在order_add.html文件中 .

我可以使用什么来创建具有ForeignKey字段的模型的表单?

order.py

class Order(models.Model):
    PAY_METHOD_CHOISES = (
        ('CASH', 'cash'),
        ('CREDIT', 'credit card'),
        ('CHECK', 'check'),
    )
    pay_method = models.CharField(max_length=15, choices=PAY_METHOD_CHOISES,
                                  default='cash')
    user_id = models.ForeignKey(UsersData)
    pay = models.BooleanField(default=False)

    @property
    def __str__(self):
        return self.user_id.user_name

    def pay_or_not(self):
        if self.pay:
            result = 'paid'
        else:
            result = 'not paid'
        return result

class OrderForm(ModelForm):
    all_users = forms.ModelChoiceField(queryset=UsersData.objects.all(),
                                       empty_label=None, initial=0)

    class Meta:
        model = Order
        fields = ['user_id', 'pay_method', 'pay', 'all_users']

view_order.py

def order_add(request):
    if request.method == 'POST':
        form_order = OrderForm(request.POST)
        if form_order.is_valid():
            part_order_form = form_order.save(commit=False)
            value_user = form_order.cleaned_data.get('all_users')
            user = UsersData.objects.get(use_name=value_user)
            part_order_form.user_id = user
            part_order_form.save()
        return HttpResponseRedirect('/sushi_rinjin/orders/')
    else:
        form_order = OrderForm()
        return render(request, 'sushi_rinjin/forms/order_add.html',
                      {'form_ord': form_order})

order_add.html

<form action="{% url 'sushi_rinjin:add_order'  %}" method="post">
    {% csrf_token %}
    {{ form_ord.all_users}} {{ form_ord.pay_method }} {{ form_ord.pay }}
    <input type="submit" value="Add Order" />
</form>

追溯:

环境:请求方法:GET请求URL:http://127.0.0.1:8000 / shihrinjin / order_add / Django版本:1.11.6 Python版本:3.5.3已安装的应用程序:['sushi_rinjin.apps.SushiRinjinConfig','django .contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles']已安装的中间件:[ 'django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware .AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware']模板错误:在模板/home/anastasiia/Документы/Python-Programs.git/Py_Project/sushi/sushi_rinjin/ templates / sushi_rinjin / forms / order_add.html,第3行'str'对象的错误不可调用1:2:{%csrf_token%} 3:{} {} {} 4:5:回溯:文件“/usr/local/lib/python3.5/dist-packages/django/core/handlers/exception.py “在内部41. response = get_response(request)File”/usr/local/lib/python3.5/dist-packages/django/core/handlers/base.py“in _get_response 187. response = self.process_exception_by_middleware(e,请求)_get_response 185中的文件“/usr/local/lib/python3.5/dist-packages/django/core/handlers/base.py”.response = wrapped_callback(request,* callback_args,** callback_kwargs)File“/ home /anastasiia/Документы/Python-Programs.git/Py_Project/sushi/sushi_rinjin/views/view_order.py“in order_add 46. {'form_ord':form_order})File”/usr/local/lib/python3.5/dist- packages / django / shortcuts.py“in render 30. content = loader.render_to_string(template_name,context,request,using = using)File”/usr/local/lib/python3.5/dist-packages/django/template/loader .py“在render_to_string 68中 . 返回template.render(context,request)文件”/ usr / local / l ib / python3.5 / dist-packages / django / template / backends / django.py“in render 66. return self.template.render(context)File”/usr/local/lib/python3.5/dist-packages/ django / template / base.py“在渲染中207.返回self._render(context)文件”/usr/local/lib/python3.5/dist-packages/django/template/base.py“在_render 199中 . 返回自我.nodelist.render(context)文件“/usr/local/lib/python3.5/dist-packages/django/template/base.py”在渲染990中.bit = node.render_annotated(context)文件“/ usr / local /lib/python3.5/dist-packages/django/template/base.py“在render_annotated 957中 . 返回self.render(context)文件”/usr/local/lib/python3.5/dist-packages/django/template /base.py“在渲染1046.中返回render_value_in_context(输出,上下文)文件”/usr/local/lib/python3.5/dist-packages/django/template/base.py“in render_value_in_context 1024.value = force_text(value )文件“/usr/local/lib/python3.5/dist-packages/django/utils/encoding.py”在force_text 76中.s = six.text_type(s)文件“/usr/local/lib/python3.5 / dist-packages / django / utils / html.py“in 385. klass.str = lambda self:mark_safe(klass_str(self))File”/usr/local/lib/python3.5/dist-packages/django/forms/ boundfield.py“在str 41.中返回self.as_widget()文件”/usr/local/lib/python3.5/dist-packages/django/forms/boundfield.py“in_widget 101. attrs = self.build_widget_attrs(attrs ,widget)文件“/usr/local/lib/python3.5/dist-packages/django/forms/boundfield.py”在build_widget_attrs 257.如果widget.use_required_attribute(self.initial)和self.field.required和self . form.use_required_attribute:use_required_attribute 689中的文件“/usr/local/lib/python3.5/dist-packages/django/forms/widgets.py”.first_choice = next(iter(self.choices),None)文件“/ usr /local/lib/python3.5/dist-packages/django/forms/models.py“in iter 1140. yield self.choice(obj)File”/usr/local/lib/python3.5/dist-packages/django /forms/models.py“在选择1146. return(self.field.prepare_value(obj),self.field.label_from_instance(obj))文件label_from_instance 1211中的“/usr/local/lib/python3.5/dist-packages/django/forms/models.py” . return force_text(obj)File“/usr/local/lib/python3.5/dist-packages/ django / utils / encoding.py“in force_text 76. s = six.text_type(s)Exception Type:TypeError at / sushi_rinjin / order_add / Exception Value:'str'对象不可调用

urlpatterns = [
    url(r'^$', view_index.index, name='index'),
    url(r'menu/', view_menu.index, name='menu'),
    url(r'ingredients/', view_ingred.index, name='ingredients'),
    url(r'orders/', view_order.index, name='orders'),
    url(r'^order/(?P<id_order>[0-9]+)/$', view_order.detail, name='detail'),
    url(r'ingredient_add/', view_ingred.ingred_add, name='add_ingred'),
    url(r'dish_add/', view_menu.dish_add, name='add_dish'),
    url(r'order_add/', view_order.order_add, name='add_order'),
]

1 回答

  • 6

    __str__ 方法中删除 @property 装饰器 .

相关问题