我已经基于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 views,general class-based views intro和as_view()
method的文档,但未成功找到解决方案。我也在stackoverflow中搜索了一些解决方案,但没有找到任何东西。
关于如何进行这项工作的任何提示?
编辑
当我尝试访问登录页面时发生错误:
编辑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"