Пользовательские параметры URL-адреса Django в представлении базового класса - PullRequest
0 голосов
/ 12 сентября 2018

Я написал основанные на классах представления, основанные на generic.base.view, чтобы получить информацию о профилях пользователей (данные поступают из разных моделей и таблиц БД).Представления будут использоваться для просмотра некоторой пользовательской информации в социальной сети, а также собственным пользователем при редактировании своего профиля.

Вот представление:

class ProfileView(PageTitleMixin, generic.View):
    template = "common/profile.html"
    template_name = "Perfil"
    page_title = _('Profile')
    active_tab = 'profile'
    success_url = reverse_lazy('usrxtnsion:profile')

    def get_queryset(self):
        return User.objects.filter(username=self.kwargs['username'])

    def get_context_data(self, **kwargs):
        ctx = super().get_context_data(**kwargs)
        account_info = Profile.objects.get(pk=self.request.user.profile.pk)
        user_info = User.objects.get(pk=self.request.user.pk)
        ctx['user_fields'] = self.get_profile_fields(self.request.user)
        ctx['profile_fields'] = user_info.profile_set.all()
        ctx['address_fields'] = user_info.useraddress_set.all()
        ctx['account_fields'] = account_info.account_set.all()
        ctx['username'] = self.request.user.username
        return ctx

    def get_profile_fields(self, user):
        field_data = []

        # Check for custom user model
        for field_name in User._meta.additional_fields:
            field_data.append(
                self.get_model_field_data(user, field_name))

        # Check for profile class
        profile_class = get_profile_class()
        if profile_class:
            try:
                profile = profile_class.objects.get(user=user)
            except ObjectDoesNotExist:
                profile = profile_class(user=user)

            field_names = [f.name for f in profile._meta.local_fields]
            for field_name in field_names:
                if field_name in ('user', 'id'):
                    continue
                field_data.append(
                    self.get_model_field_data(profile, field_name))

        return field_data

    def get_model_field_data(self, model_class, field_name):
        """
        Extract the verbose name and value for a model's field value
        """
        field = model_class._meta.get_field(field_name)
        if field.choices:
            value = getattr(model_class, 'get_%s_display' % field_name)()
        else:
            value = getattr(model_class, field_name)
        return {
            'name': getattr(field, 'verbose_name'),
            'value': value,
        }

    def get(self, request, *args, **kwargs):
        user_form = SignupForm(instance=self.request.user)
        profile_form = ProfileForm(instance=self.request.user.profile)
        account_form = AccountForm(instance=self.request.user)
        address_form = UserAddressForm(instance=self.request.user)
        username = request.user.username

        return render(request, 'common/profile.html', {
            'user_form': user_form,
            'profile_form': profile_form,
            'account_form': account_form,
            'address_form': address_form,
            'username': username
        })

    def post(self, request, *args, **kwargs):
        user_form = SignupForm(instance=self.request.user)
        profile_form = ProfileForm(instance=self.request.user.profile)
        account_form = AccountForm(instance=self.request.user)
        address_form = UserAddressForm(instance=self.request.user)

        if user_form.is_valid() and profile_form.is_valid() and account_form.is_valid() and address_form.is_valid():
            user_form.save()
            profile_form.save()
            account_form.save()
            address_form.save()
            messages.success(request, _('Seu perfil foi atualizado!'))
            return redirect('settings:profile')
        else:
            messages.error(request, _('Por favor, corriga os erros abaixo.'))

    def form_valid(self, form):
        try:
            old_user = User.objects.get(id=self.request.user.id)
        except User.DoesNotExist:
            old_user = None

        form.save()

        new_email = form.cleaned_data.get('email')
        if new_email and old_user and new_email != old_user.email:
            ctx = {
                'user': self.request.user,
                'site': get_current_site(self.request),
                'reset_url': get_password_reset_url(old_user),
                'new_email': new_email,
            }
            msgs = CommunicationEventType.objects.get_and_render(
                code=self.communication_type_code, context=ctx)
            Dispatcher().dispatch_user_messages(old_user, msgs)

        messages.success(self.request, _("Profile updated"))
        return redirect(self.get_success_url())

Проблема заключается в том, чтоЯ пытаюсь вставить имя пользователя в URL, и я не вхожу в него.URL-адрес следующий:

path('profile/<username>/', login_required(views.ProfileView.as_view()), name="profile"),

Но у меня возникла проблема с передачей аргумента <username> на URL-адрес.Я уже пытался вставить get_queryset(), чтобы получить все детали username, но Django по-прежнему выдает ошибку msg

Reverse for 'profile' with no arguments not found. 1 pattern(s) tried: ['profile/(?P<username>[^/]+)/$']

Я прочитал документы о универсальном классе-основанные на представлении отображения , общие представления на основе классов и as_view() метод , но безуспешно при поиске решения.Я также искал в stackoverflow какое-то решение и ничего не нашел.

Есть какие-нибудь советы о том, как заставить это работать?


EDIT

Ошибка возникает, когда я пытаюсь получить доступ к странице входа в систему:

This is the error


РЕДАКТИРОВАТЬ 2

Мои шаблоны URL для этого следующие:

urlpatterns = [
    path('login/', auth_views.LoginView.as_view(), {'template_name': 'common/login.html'}, name="login"),
    path('resetar-senha/', auth_views.PasswordResetView.as_view(), name="forgot_password"),
    path('logout/', auth_views.LogoutView.as_view(), {'next_page': ''}, name="logout"),
    path('change-password/', core_views.ChangePasswordView, name="change_pass"),
    path('profile/<str:username>/', login_required(views.ProfileView.as_view()), name="profile"),
    # path('dashboard/<username>/', views.DashboardView.dashboard, name="dashboard"),
    path('cadastrar/', core_views.SignupView, name="create_user")
]

Я использую встроенный вид входа в систему django со следующими настройками:

LOGIN_URL = "usrxtnsion:login"
LOGOUT_URL = "usrxtnsion:logout"
SIGNUP_REDIRECT_URL = "usrxtnsion:profile"
LOGIN_REDIRECT_URL = "usrxtnsion:profile"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...