Jadikan Profil Pengguna Terlihat oleh Semua Pengguna Termasuk AnonyMouseUser() di Django

Saya mencoba membuat UserProfileView dengan nama pengguna pengguna di url. Sebenarnya, ini berfungsi dengan pengaturan sebenarnya. Masalahnya adalah, ekstensi nama pengguna apa pun di url dialihkan ke profil pengguna yang masuk. Dan, tidak ada info yang masuk ke templat ketika saya mencoba membuka profil tanpa masuk. Ini kode saya, bantuan apa pun sangat kami hargai.

model.py

class Profile(models.Model):
  user = models.OneToOneField(User, related_name='profile', on_delete=models.CASCADE)
  email = models.EmailField(max_length=150)
  bio = models.TextField(max_length=280, blank=True)
  avatar = models.ImageField(default='default.jpg', upload_to='avatars/')

  def __str__(self):
    return '@{}'.format(self.user.username)

  def save(self):
    super().save()

    img = Image.open(self.avatar.path)

    if img.height > 300 or img.width > 300:
      output_size = (300, 300)
      img.thumbnail(output_size, Image.BICUBIC)
      img.save(self.avatar.path)

dilihat.py

class UserProfileView(SelectRelatedMixin, TemplateView):
  model = Profile
  template_name = 'accounts/profile.html'
  select_related = ('user',)

  def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    return context

  def get_success_url(self):
    return reverse('accounts:profile', kwargs={'user': self.object.user})

urls.py

urlpatterns = [
  path('<str:username>/', views.UserProfileView.as_view(), name='profile')
]

profile.html (bagaimana saya memanggil data terkait di template)

<h3>{{ user.profile }}</h3>
      <p>{{ user.profile.email }}</p>
      <p>{{ user.profile.bio }}</p>
        <h3>{{ profile }}</h3>

*update untuk penjelasan lebih jelas:

berikut profil pengguna saat mencoba tanpa login

dan profil pengguna yang sama di sini saat masuk. sebenarnya, itu harus menampilkan profil pengguna dengan nama pengguna di url. namun, profil pengguna saat ini selalu ditampilkan di url mana pun.


person Ediz    schedule 15.10.2020    source sumber
comment
Tidak begitu jelas apa masalah Anda   -  person GProst    schedule 15.10.2020
comment
Mencoba menambahkan contoh foto masalah tersebut. semoga sekarang lebih bisa dimengerti.   -  person Ediz    schedule 16.10.2020
comment
Apakah Anda memiliki bidang username pada model User atau Profile? Mencoba mencari tahu mengapa Anda menggunakan tampilan untuk Profil, bukan hanya untuk Pengguna...   -  person GProst    schedule 16.10.2020
comment
benar, Model pengguna memiliki nama pengguna attr. Selain itu, model Profil dihubungkan oleh OneToOneField dengan model Pengguna.   -  person Ediz    schedule 16.10.2020
comment
Jadi bisakah Anda membuat UserView saja, bukan UserProfileView yang menggunakan model User, bukan Profile? Bukankah lebih sederhana? Saya melihat bahwa di templat Anda tetap mengakses profile melalui user.profile...   -  person GProst    schedule 16.10.2020
comment
Sudah mencoba tetapi masih menampilkan info pengguna saat ini ke templat di url mana pun. Selain itu, fungsi get_queryset tidak berfungsi. Yang; def get_queryset(self): queryset = super().get_queryset() return queryset.filter(user__username__iexact=self.kwargs.get('user.username'))   -  person Ediz    schedule 16.10.2020
comment
Kode dalam komentar tidak berdiri tegak. Semoga jelas.   -  person Ediz    schedule 16.10.2020


Jawaban (1)


Anda perlu menambahkan BaseDetailView, menentukan metode get_object dan menambahkan 'user' ke konteks:

class UserProfileView(SelectRelatedMixin, BaseDetailView, TemplateView):
  model = Profile
  template_name = 'accounts/profile.html'
  select_related = ('user',)

  def get_object(self):
   return self.get_queryset().get(user__username=self.kwargs['username'])

  def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    content['user'] = self.object.user
    return context

Alternatifnya, Anda dapat mendasarkan pandangan Anda pada model User, bukan Pofile (menurut saya cara ini lebih sederhana):

class UserProfileView(SelectRelatedMixin, BaseDetailView, TemplateView):
  model = User
  template_name = 'accounts/profile.html'
  select_related = ('profile',)

  def get_object(self):
   return self.get_queryset().get(username=self.kwargs['username'])

  def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    content['user'] = self.object
    return context

Atau Anda bahkan tidak perlu repot menambahkan 'user' ke konteks dan cukup mengakses pengguna di templat melalui object

person GProst    schedule 15.10.2020
comment
Memperbarui jawaban saya dengan beberapa perbaikan - person GProst; 16.10.2020
comment
Ya, itu berhasil! SingleObjectMixin pada awalnya tidak bekerja tanpa objek apa pun, tetapi BaseDetailView telah melakukan pekerjaan itu untuk saya. Terima kasih atas usahanya, dihargai! - person Ediz; 16.10.2020
comment
Btw, menurut saya Anda juga bisa mengganti BaseDetailView + TemplateVIew hanya dengan menggunakan DetailView - person GProst; 16.10.2020