Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 编写一个基于类的视图,该视图返回经过身份验证的用户创建的模型实例_Django_Django Views - Fatal编程技术网

Django 编写一个基于类的视图,该视图返回经过身份验证的用户创建的模型实例

Django 编写一个基于类的视图,该视图返回经过身份验证的用户创建的模型实例,django,django-views,Django,Django Views,我是Python和Django的新手,正在尝试获取当前用户创建的模型实例。 我可以获得当前user.id作为主键,但我很难找到如何引用当前用户并将其应用于视图。 目前,我有一个OneToOne关系的CustomUser和Profile,但两者都运行不同的pk(这是有意义的),但尽管我可以获得当前用户id并通过url应用它,但它引用的是CustomUser而不是Profile。 因此,我可以通过用户界面中的按钮访问此视图,该按钮应该调用DetailView中的Profile实例,然后调用后续的Up

我是Python和Django的新手,正在尝试获取当前用户创建的模型实例。 我可以获得当前user.id作为主键,但我很难找到如何引用当前用户并将其应用于视图。 目前,我有一个OneToOne关系的CustomUser和Profile,但两者都运行不同的pk(这是有意义的),但尽管我可以获得当前用户id并通过url应用它,但它引用的是CustomUser而不是Profile。 因此,我可以通过用户界面中的按钮访问此视图,该按钮应该调用DetailView中的Profile实例,然后调用后续的UpdateView

       class CustomUser(AbstractUser):
class Meta:
    pass

def __str__(self):
    return f"Username: {self.username}, PK: {self.id}"
类配置文件(models.Model):

基于类的视图: 我试着获取我可以获取的经过身份验证的用户id,我想我需要通过某种类型的查询集来获取它,但后来我被卡住了

    class CompanyDetailView(LoginRequiredMixin, DetailView):
model = Profile
fields = '__all__'
query_pk_and_slug = True
template_name = "users/interface/profile_detail.html"

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    context['profile'] = Profile.objects.all()
    return context
# For example, if you want to return to a certain user
# profile (which requires url adjustments to take a Primary Key)
def get_success_url(self):
    user_id = self.request.user.id # Get user_id from request
    return reverse_lazy('users:userindex', kwargs={'id': user_id})

def get_queryset(self):
    return Profile.objects.filter(author_id=self.request.user)
下面是创建概要文件模型的CreateProfileView

      class CreateProfileView(LoginRequiredMixin, CreateView):
'''creates a new UserProfile Model, only one allowed per customer atm'''
modelform = ProfileForm
model = Profile
fields = ['title', 'st_address', 'city', 'state', 'zipcode', 'contact_name', 'contact_email', 'contact_phone']
query_pk_and_slug = True

success_url = reverse_lazy('users:userindex')
template_name = 'users/interface/profile_form.html'
def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    context['profile'] = Profile.objects.all()
    return context

def form_valid(self, form):
    form.instance.author = self.request.user
    return super().form_valid(form)
编辑:对任何遇到此问题的人的答案

问题出在get_success_url中,该url为

def get_success_url(self):
    user_id = self.request.user.id# Get user_id from request
    return reverse_lazy('users:userindex', kwargs={'id': user_id})
应该是

def get_success_url(self):
    profile_id = request.user.profile.pk # Get user_id from request
    return reverse_lazy('users:userindex', kwargs={'id': profile_id})
它是用这个url调用的

path('userdetail-<int:pk>/', UserDetailView.as_view(), name='userprofile')
path('userdetail-/',UserDetailView.as_view(),name='userprofile')
用这个标签

<a class="nav-item nav-link" href="{% url 'users:userprofile' user.profile.pk %}">Company Profile</a>


我不清楚问题出在哪里。如果它在
get\u success\u url
方法中,那么您需要
request.user.user.pk
来获取配置文件的pk。第二个
用户
是因为您有
相关的
。由于相关名称用于从用户转到配置文件,因此最好将其删除。它将默认为
related\u name='profile'
,然后您使用'request.user.profile.pk获取配置文件pk.ahh。。。这是有道理的。我试试,谢谢你,不是这样的。它仍然引用自定义用户id,而不是模型id。我不得不改变一些东西,但我现在得到了正确的pk模型。关于使用request.user.profile.pk,您是正确的。我只需要更改一些引用tempate标记和一些URL来反映我感谢Alasdair的帮助,我花了几天的时间试图弄明白这一点
<a class="nav-item nav-link" href="{% url 'users:userprofile' user.profile.pk %}">Company Profile</a>