编写基于类的视图,该视图返回由authenicated_user

时间:2020-03-16 14:36:01

标签: django django-views

我是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>

0 个答案:

没有答案