Невозможно получить значение аргумента, переданного через URL-адрес

Я пытаюсь изучить Django, работая над небольшим проектом. На сайте есть 3 кнопки на главной странице (Home.html). Каждая кнопка представляет тип пользователя. При нажатии на кнопку пользователь переходит на страницу регистрации. В GET-запросе к странице регистрации переменная user_type устанавливается на основе значения кнопки, которая была нажата на главной странице.

Переменная передается в шаблон Signup.html и используется в качестве параметра для POST-запроса. Я хочу использовать этот параметр из URL в моем представлении регистрации и установить поле базы данных с именем user_type. Но я не могу получить значение параметра в представлении. При выводе u_type я получаю пустую строку. Хотя URL-адрес в браузере показывает значение параметра user_type. Пожалуйста, помогите мне с этой проблемой. Я также готов попробовать альтернативные способы достижения тех же результатов.

view.py

from django.shortcuts import render
from django.http import HttpResponse
from .forms import SpaceUserForm
from django.contrib.auth import authenticate, login
from django.contrib.auth.decorators import login_required

def home(request):
    return render(request, 'Users/Home.html')

def signup(request, u_type=''):
    if request.method == 'POST':
        form = SpaceUserForm(request.POST)
        user = form.save(commit=False)
        print(u_type)
        if form.is_valid():
            user.user_type = str(u_type)
            user.save()
            login(request, user)
            return HttpResponse("User was created successfully.")
        else:
            return HttpResponse("There was an error.")
    else:
        form = SpaceUserForm()
        context ={}
        print(list(request.GET.items()))
        if request.GET.get('addAgent'):
            user_type = 'AG'
        elif request.GET.get('addCustomer'):
            user_type = 'CU'
        elif request.GET.get('addWarehouseOwner'):
            user_type = 'WO'
        context['form'] =SpaceUserForm()
        context['user_type'] = user_type
    return render(request, 'Users/SignUp.html', context)

Home.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Home</title>
</head>
<body>
<p>Please choose an option</p>

<form action="/signUp">
    <span>
    <input type="submit" name="addAgent" value="Agent" />
    <input type="submit" name="addCustomer" value="Customer"/>
    <input type="submit" name="addWarehouseOwner" value="Warehouse Owner" />
    </span>
</form>

</body>
</html>

SignUp.html

<!DOCTYPE html>
<head>
  <title>AbstractBaseUser Form Example</title>
</head>

<p>This is an example of a signup form with custom fields based on a model that
subclasses the AbstractBaseUser model in Django.</p>

<p>Aside from a couple of fields Django always retains for any user (is_active,
last_login and password), this option enables you to restrict the fields to whatever
you want.</p>

<form action="{% url 'Users:signup' u_type=user_type %}" method="POST">{% csrf_token %}
    <table>
      <tbody>
        {{ form.as_table }}
      </tbody>
    </table>
      <p>&nbsp</p>
      <p><button type="submit">signup</button></p>
</form>

urls.py

from django.conf.urls import url, include
from . import views

app_name = 'Users'

urlpatterns = [
    url(r'^$', views.home, name='home'),
    url(r'^signUp', views.signup, name='signup'),
    url(r'^signUp/(?P<u_type>)', views.signup, name='signup'),
    url(r'login', views.logedin, name='login')
]

Мне кажется, вы немного усложняете ситуацию. Возможно, было бы проще, если бы вы использовали ссылки со строкой запроса.

<a href="signup?user_type=Agent"></a>
<a href="signup?user_type=User"></a>
<a href="signup?user_type=WarehouseOwner"></a>

Затем в вашем представлении django вы можете использовать:

type = request.GET.get('user_type')

и он будет иметь значение вашего типа пользователя.

Вернуться на верх