基类视图上的Django URL自定义参数

时间:2018-09-12 19:23:03

标签: django class url view

我已经基于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上插入用户名,但我没有使用它。网址如下:

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>[^/]+)/$']

我已阅读有关generic class-based display viewsgeneral class-based views introas_view() method的文档,但未成功找到解决方案。我也在stackoverflow中搜索了一些解决方案,但没有找到任何东西。

关于如何进行这项工作的任何提示?


编辑

当我尝试访问登录页面时发生错误:

This is the error


编辑2

我为此的网址格式如下:

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"

0 个答案:

没有答案