wrufesh
wrufesh

Reputation: 1406

django python cannot concatenate 'str' and '__proxy__' objects

I have forms.py in a Django app.

from django import forms
from django.core.urlresolvers import reverse_lazy

class ComposeMessageForm(forms.Form):
ccc = reverse_lazy('user_api')
st = 'customSelectize:u_r,modelUrl:"'+ reverse_lazy('user_api') +'", choiceField:"username"'
user_receivers = forms.ModelMultipleChoiceField(
    queryset=User.objects.all(),
    required=False,
    widget=forms.SelectMultiple(
        attrs={
            'data-bind': st,
            'placeholder': 'Select USERS'}))

When I run it I get

TypeError at /message/compose/

cannot concatenate 'str' and '__proxy__' objects

How can this be done? I have no idea what __proxy__ object is.

urls.py is:

from django.conf.urls import patterns, include, url
from rest_framework.urlpatterns import format_suffix_patterns
from django.contrib import admin
from msgin import views

urlpatterns = patterns('',
                   url(r'^$', 'ms.views.home', name='home'),
                   url(r'^message/', include('msgin.urls')),
                   url(r'^admin/', include(admin.site.urls)),
                   url(r'^msgs/$', views.MessageList.as_view()),
                   url(r'^msgs/(?P<pk>[0-9]+)/$',
                       views.MessageDetail.as_view()),
                   url(r'^users/$', views.UserList.as_view(),
                       name='user_api'),
                   url(r'^users/(?P<pk>[0-9]+)/$',
                       views.UserDetail.as_view()),
                   url(r'^groups/$', views.GroupList.as_view(),
                       name='groups_api'),
                   url(r'^groups/(?P<pk>[0-9]+)/$',
                       views.GroupDetail.as_view()),
                   )

Upvotes: 1

Views: 4010

Answers (3)

Ahmed Safadi
Ahmed Safadi

Reputation: 4590

Just put it inside str()

from django.utils.translation import ugettext_lazy as _
str(self.price) + " " + str(_("USD"))

Upvotes: 2

sax
sax

Reputation: 3806

there is no benefit to use reverse_lazy in the class definition, as cannot be "lazy"

you two options

1) use reverse

2) change your code as

class ComposeMessageForm(forms.Form):

    user_receivers = forms.ModelMultipleChoiceField(queryset=User.objects.all(),
                                                    required=False)

    def __init__(self, *args, **kwargs):
        super(ComposeMessageForm, self).__init__(*args, **kwargs)
        st = 'customSelectize:u_r,modelUrl:"%s", choiceField:"username"' % reverse_lazy('user_api')
        self.fields['user_receivers'].widget=forms.SelectMultiple(attrs={'data-bind': st, 
                                                                         'placeholder': 'Select USERS'})

Upvotes: 1

catavaran
catavaran

Reputation: 45575

proxy url is the url which resolves later, not at the time of calling reverse_lazy() func. For this concrete case you can use simple reverse() function instead of lazy one.

But if want use reverse_lazy() when you should coerce proxy url to string:

st = 'customSelectize:u_r,modelUrl:"'+ str(reverse_lazy('user_api')) +'", choiceField:"username"'

or use string formatting:

st = 'customSelectize:u_r,modelUrl:"%s", choiceField:"username"' % reverse_lazy('user_api')

Upvotes: 0

Related Questions