Захваченные параметры URL в форме

Я использую Userena, и я пытаюсь захватить параметры URL-адреса и передать их в свою форму, но я потерял, как это сделать.

Что я хотел бы сделать в своем шаблоне:

<a href="/accounts/signup/freeplan">Free Plan</a><br/>
<a href="/accounts/signup/proplan">Pro Plan</a><br/>
<a href="/accounts/signup/enterpriseplan">Enterprise Plan</a><br/>

А потом в моем urls.py

url(r'^accounts/signup/(?P<planslug>.*)/$','userena.views.signup',{'signup_form':SignupFormExtra}),

Затем, в идеале, я хотел бы использовать этот план в моем Forms.py, чтобы установить пользовательский план в профиле.

Я не знаю, как получить захваченный параметр URL-адреса в пользовательской форме. Могу ли я использовать extra_context, нужно ли переопределять вид регистрации Userena?


person Cliff Helsel    schedule 20.02.2013    source источник


Ответы (2)


Если вы используете представления на основе классов, вы можете перезаписать метод def get_form_kwargs() класса FormMixin. Здесь вы можете передать любые параметры, которые вам нужны для вашего класса формы.

в urls.py:

url(r'^create/something/(?P<foo>.*)/$', MyCreateView.as_view(), name='my_create_view'),

в представлениях.py:

class MyCreateView(CreateView):
    form_class = MyForm
    model = MyModel

    def get_form_kwargs(self):
        kwargs = super( MyCreateView, self).get_form_kwargs()
        # update the kwargs for the form init method with yours
        kwargs.update(self.kwargs)  # self.kwargs contains all url conf params
        return kwargs

в формах.py:

class MyForm(forms.ModelForm):

    def __init__(self, foo=None, *args, **kwargs)
        # we explicit define the foo keyword argument, cause otherwise kwargs will 
        # contain it and passes it on to the super class, who fails cause it's not
        # aware of a foo keyword argument.
        super(MyForm, self).__init__(*args, **kwargs)
        print foo  # prints the value of the foo url conf param

надеюсь это поможет :-)

person ceasaro    schedule 16.07.2014
comment
И если вы не используете представления на основе классов? - person Diana Carolina Hernandez; 27.08.2017

Вы можете получить доступ к URL-адресу в своем шаблоне, используя -

{% request.get_full_path %}

(дополнительную информацию см. в документах. Информация).

Однако, если вы просто хотите получить переменную planslug, передайте ее из представления в шаблон и получите доступ к ней в шаблоне (она доступна в представлении, потому что это именованный параметр в URL-адресе) -

def signup(request, planslug=None):
    #
    render(request, 'your_template.html', {'planslug':planslug}

а затем в вашем шаблоне вы получите его с помощью -

{% planslug %}

Если вы используете представления на основе классов, вам необходимо переопределить get_context_data, чтобы добавить переменную planslug в ваш контекст перед передачей ее в шаблон-

def get_context_data(self, *args, **kwargs):
    context = super(get_context_data, self).get_context_data(*args, **kwargs)
    context['planslug'] = self.kwargs['planslug']
    return context
person Aidan Ewen    schedule 20.02.2013