0
votes

I want to add Select field to form for field with type ForeignKey and use for this ModelChoiceField. But this form doesn`t rendering and throw error

"'str' object is not callable"
on the line " {{ form_ord.all_users}} {{ form_ord.pay_method }} {{ form_ord.pay }}" in order_add.html file.

What can I use to create form for model with ForeignKey field?

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>

Traceback:

Environment:

Request Method: GET Request URL: http://127.0.0.1:8000/sushi_rinjin/order_add/

Django Version: 1.11.6 Python Version: 3.5.3 Installed Applications: ['sushi_rinjin.apps.SushiRinjinConfig', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles'] Installed Middleware: ['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']

Template error: In template /home/anastasiia/Документы/Python-Programs.git/Py_Project/sushi/sushi_rinjin/templates/sushi_rinjin/forms/order_add.html, error at line 3 'str' object is not callable 1 : 2 : {% csrf_token %} 3 : {{ form_ord.all_users}} {{ form_ord.pay_method }} {{ form_ord.pay }} 4 : 5 :

Traceback:

File "/usr/local/lib/python3.5/dist-packages/django/core/handlers/exception.py" in inner 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, request)

File "/usr/local/lib/python3.5/dist-packages/django/core/handlers/base.py" in _get_response 185. 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" in render_to_string 68. return template.render(context, request)

File "/usr/local/lib/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" in render 207. return self._render(context)

File "/usr/local/lib/python3.5/dist-packages/django/template/base.py" in _render 199. return self.nodelist.render(context)

File "/usr/local/lib/python3.5/dist-packages/django/template/base.py" in render 990. bit = node.render_annotated(context)

File "/usr/local/lib/python3.5/dist-packages/django/template/base.py" in render_annotated 957. return self.render(context)

File "/usr/local/lib/python3.5/dist-packages/django/template/base.py" in render 1046. return render_value_in_context(output, context)

File "/usr/local/lib/python3.5/dist-packages/django/template/base.py" in render_value_in_context 1024. value = force_text(value)

File "/usr/local/lib/python3.5/dist-packages/django/utils/encoding.py" in force_text 76. s = six.text_type(s)

File "/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" in str 41. return self.as_widget()

File "/usr/local/lib/python3.5/dist-packages/django/forms/boundfield.py" in as_widget 101. attrs = self.build_widget_attrs(attrs, widget)

File "/usr/local/lib/python3.5/dist-packages/django/forms/boundfield.py" in build_widget_attrs 257. if widget.use_required_attribute(self.initial) and self.field.required and self.form.use_required_attribute:

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

File "/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" in choice 1146. return (self.field.prepare_value(obj), self.field.label_from_instance(obj))

File "/usr/local/lib/python3.5/dist-packages/django/forms/models.py" in label_from_instance 1211. 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' object is not callable

    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
can we see your url.py ?scharette
Added urls.py Note: If I delete "{{ form_ord.all_users}}" from order_add.html everything works.Anastasiia Chorna
did you try simple {{ form_ord }} and why you add all_users if you have the field user_id ?Brown Bear
Can you print UsersData.objects.all() ? It seems you had been create users and they can't be parse by the form in runtime. If I were you then I would clear DB and try again.Abbasov Alexander
And try to set initial=None or remove this param.Abbasov Alexander

1 Answers

6
votes

Remove the @property decorator from __str__ method.