使用ModelChoiceField查看错误"str不可调用"

0 python django django-forms

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

"'
{ form '对象不可调用"在order_add.html文件中的"{{ form_ord.all_users }} {{form_ord.pay_method}} {{form_ord.pay}}"行中.

我可以使用什么来创建具有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']
Run Code Online (Sandbox Code Playgroud)

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})
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

追溯:

环境:

请求方法: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:{{form_ord.all_users}} {{form_ord.pay_method}} {{form_ord.pay}} 4:5:

追溯:

文件"/usr/local/lib/python3.5/dist-packages/django/core/handlers/exception.py"在内部41. response = get_response(request)

_get_response中的文件"/usr/local/lib/python3.5/dist-packages/django/core/handlers/base.py"187. response = self.process_exception_by_middleware(e,request)

_get_response中的文件"/usr/local/lib/python3.5/dist-packages/django/core/handlers/base.py"185. response = wrapped_callback(request,*callback_args,**callback_kwargs)

在order_add 46中输入文件"/home/anastasiia/Документы/Python-Programs.git/Py_Project/sushi/sushi_rinjin/views/view_order.py".{'form_ord':form_order})

渲染中的文件"/usr/local/lib/python3.5/dist-packages/django/shortcuts.py".content = loader.render_to_string(template_name,context,request,using = using)

在render_to_string 68中输入文件"/usr/local/lib/python3.5/dist-packages/django/template/loader.py".返回template.render(context,request)

在渲染66中输入文件"/usr/local/lib/python3.5/dist-packages/django/template/backends/django.py".返回self.template.render(context)

在渲染207中输入文件"/usr/local/lib/python3.5/dist-packages/django/template/base.py".返回self._render(context)

在_render 199中输入文件"/usr/local/lib/python3.5/dist-packages/django/template/base.py".返回self.nodelist.render(context)

在渲染990中输入文件"/usr/local/lib/python3.5/dist-packages/django/template/base.py".bit = node.render_annotated(context)

在render_annotated 957中输入文件"/usr/local/lib/python3.5/dist-packages/django/template/base.py".返回self.render(context)

在渲染1046中输入文件"/usr/local/lib/python3.5/dist-packages/django/template/base.py".返回render_value_in_context(输出,上下文)

在render_value_in_context 1024中输入文件"/usr/local/lib/python3.5/dist-packages/django/template/base.py".value = force_text(value)

在force_text 76中输入文件"/usr/local/lib/python3.5/dist-packages/django/utils/encoding.py".s = six.text_type(s)

在385.klass中输入文件"/usr/local/lib/python3.5/dist-packages/django/utils/html.py".str = lambda self:mark_safe(klass_str(self))

str 41中输入文件"/usr/local/lib/python3.5/dist-packages/django/forms/boundfield.py" .返回self.as_widget()

在as_widget 101中输入文件"/usr/local/lib/python3.5/dist-packages/django/forms/boundfield.py".attrs = self.build_widget_attrs(attrs,widget)

如果widget.use_required_attribute(self.initial)和self.field.required以及self.form.use_required_attribute,则在build_widget_attrs 257中输入文件"/usr/local/lib/python3.5/dist-packages/django/forms/boundfield.py". :

use_required_attribute 689中的文件"/usr/local/lib/python3.5/dist-packages/django/forms/widgets.py".first_choice = next(iter(self.choices),None)

iter 1140中输入"/usr/local/lib/python3.5/dist-packages/django/forms/models.py".yield self.choice(obj)

选择1146中的文件"/usr/local/lib/python3.5/dist-packages/django/forms/models.py".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)

在force_text 76中输入文件"/usr/local/lib/python3.5/dist-packages/django/utils/encoding.py".s = six.text_type(s)

异常类型:/ sushi_rinjin/order_add/Exception值中的TypeError:'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'),
] 
Run Code Online (Sandbox Code Playgroud)

小智 6

@property__str__方法中删除装饰器.

  • 也许你肯定不应该把`__str__`作为财产. (2认同)