我想为类型为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 回答
从
__str__
方法中删除@property
装饰器 .