我是Python和Django的超级新手,正在尝试获取当前用户制作的Model实例。 我可以将当前user.id作为pk获取,但正在努力寻找如何引用该当前用户并将其应用于View的方法。 目前,我在OneToOne关系上具有CustomUser和Profile,但是两者都运行不同的pk(这很有意义),但是虽然我可以获取当前用户ID并通过引用CustomUser而不是Profile的url应用它。 因此,我可以通过用户界面中的按钮访问此视图,该用户界面应该在DetailView中调用Profile实例,然后在UpdateView上关注
class CustomUser(AbstractUser):
class Meta:
pass
def __str__(self):
return f"Username: {self.username}, PK: {self.id}"
class Profile(models.Model):
# TODO: Define fields here
# add additional templates under templates/users. Add to the tuples below in this format.
USER_TEMPLATES = (
('users/generic/generic.html', ('generic')),
('users/clothing/clothing.html',('clothing'))
)
#model fields
author = models.OneToOneField(CustomUser, on_delete=models.CASCADE, editable = False, related_name = 'user')
title = models.CharField(verbose_name = 'Company Name', max_length= 50)
slug = models.SlugField(editable=False,max_length = settings.SLUG_TITLE_MAX_LENGTH)
st_address = models.CharField( max_length=50, verbose_name = 'Street Address')
city = models.CharField(blank = True, max_length = 50, verbose_name = 'City')
state = USStateField(default = 'TN', blank=True)
zipcode = models.CharField(null = True, blank = True, max_length=15)
contact_name = models.CharField(verbose_name = 'Contact Person Name', null = True, blank = True, max_length=50)
contact_email = models.EmailField(verbose_name = 'Contact Person Email', null = True, blank = True, max_length=254)
contact_phone = models.CharField(verbose_name = 'Best Phone Number to Contact', null = True, blank = True, max_length=50, help_text = "Business Phone (XXX) XXX-XXXX")
aboutus = models.TextField(null= True, blank= True, help_text="Write about a paragraph about who you are and the good things your business does.")
greeting = models.TextField(null= True, blank= True, help_text = "Write about a paragraph telling who you are to greet your customers on the front page of your website.")
logo = models.ImageField(null = True, blank = True, upload_to='pic_folder/', height_field=None, width_field=None, max_length=300)
template = models.CharField(choices = USER_TEMPLATES, default = 'users/generic/generic.html', max_length=50)
facebook = models.URLField(blank = True, max_length=200)
instagram = models.URLField(blank = True, max_length=200)
twitter = models.URLField(blank = True, max_length=200)
# absolute url
def get_absolute_url(self):
kwargs = {
'pk': self.id,
'slug': self.slug
}
return reverse ('profile-pk-slug-detail', kwargs=kwargs)
def save(self, *args, **kwargs):
value = self.title
self.slug = slugify(value, allow_unicode=True)
super().save(*args, **kwargs)
class Meta:
"""Meta definition for Profile."""
verbose_name = 'Profile'
verbose_name_plural = 'Profiles'
def __str__(self):
"""Unicode representation of Profile."""
return f"Company Name: {self.title} Slug: {self.pk}-{self.slug} Type: {self.template}"
基于类的视图: 我试图获取经过身份验证的用户ID,我想我需要通过某种类型的queryset来获取它,但随后我被卡住了。
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)
这是创建Profile模型的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中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')
带有此标记
<a class="nav-item nav-link" href="{% url 'users:userprofile' user.profile.pk %}">Company Profile</a>