почему страница не возвращает меня на правильную страницу профиля пользователя? - PullRequest
0 голосов
/ 12 июля 2020

У меня странная проблема: я создал пользователя и профиль пользователя, затем я создаю функцию, которая приводит к сохранению пользователя в качестве экземпляра в профиле пользователя, поскольку вы можете видеть приведенный ниже код, который мне нужен, когда кто-то щелкает пользователя, который создает сообщение, которое вернется на страницу профиля этого пользователя, но этого не произойдет. что происходит, когда я нажимаю на пользователя, предположим, я использую имя пользователя с именем Abdin, и мне нужно нажать на John, проблема в том, что страница вернет меня обратно на страницу моего профиля, в данный момент (Abdin), также если я хочу измените пользователя, поэтому я войду в систему с пользователем John, и когда мне нужно будет нажать на Abdin, я вернусь обратно в профиль John, а не в профиль Abdin, однако, когда я проверю страницу, чтобы убедиться в URL-адресе пользователя Я вижу, что этот URL-адрес правильный, но он не ведет меня на нужную страницу, так в чем же ошибку, которую я сделал здесь?

# account app
models.py

from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.template.defaultfilters import slugify

CHOICE = [('male', 'male'), ('female', 'female')]


class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    slug = models.SlugField(max_length=100, unique=True, blank=True)
    overview = models.TextField(editable=True, blank=True, default='You have no an Overview yet')
    city = models.CharField(max_length=20, blank=False)
    phone = models.IntegerField(default=0, blank=True)
    sex = models.CharField(max_length=10, default='male', choices=CHOICE)
    skill = models.CharField(max_length=100, default='You have no skills yet')
    logo = models.ImageField(upload_to='images/', default='images/default-logo.jpg', blank=True)

    def __str__(self):
        return self.user.username

    def save(self, *args, **kwargs):
        self.slug = slugify(self.user)
        super().save(*args, **kwargs)


def create_profile(sender, **kwargs):
    if kwargs['created']:
        user_profile = UserProfile.objects.create(user=kwargs['instance'])


post_save.connect(receiver=create_profile, sender=User)

# приложение учетной записи
views.py

from .forms import SignUp, ResetPassword, EditForm, UpdateAvatarForm, UpdateInfoForm
from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required, permission_required
from django.utils.decorators import method_decorator
from django.contrib.auth.views import PasswordResetView, PasswordResetDoneView
from django.views.generic.edit import FormView
from django.urls import reverse_lazy
from django.core.mail import send_mail
from .models import UserProfile
from django.contrib.auth.models import User
from django.http import HttpResponseRedirect, HttpResponseBadRequest
from django.views.generic import View, CreateView, UpdateView, DeleteView
from django.contrib import messages


class PasswordReset(PasswordResetView, FormView):
    template_name = 'account/password_reset_view.html'
    email_template_name = 'account/reset_password_email.html'
    subject_template_name = 'account/password_reset_subject.txt'
    form_class = ResetPassword

    def get_success_url(self):
        return reverse_lazy('account:password_reset_done')

    def post(self, request, *args, **kwargs):
        form = self.form_class(request.POST)
        if form.is_valid():
            user_mail = form.cleaned_data['email']
            user_mail = User.objects.get(email=user_mail)
            if user_mail.email:
                return HttpResponseRedirect(self.get_success_url())

    def dispatch(self, request, *args, **kwargs):
        post_form = self.request.POST
        if post_form:
            try:
                self.post(request)
            except User.DoesNotExist:
                messages.error(self.request, 'This User Does Not Exist')
                return redirect('account:password_reset')
        return super().dispatch(request, *args, **kwargs)


class PasswordResetDone(PasswordResetDoneView):
    template_name = 'account/password_reset_done.html'

    # Reset Your Password By G-mail Account
    def send_mail(self, request, **kwargs):
        subject = "Complete the modification of the password form"
        message = "please check here"
        send_mail(subject=subject,
                  message=message,
                  from_email=request.user.email,
                  recipient_list=[request.user.email],
                  fail_silently=False)
        return render(request, self.template_name)


# User registration
class Register(CreateView):
    template_name = 'account/register.html'
    form_class = SignUp
    success_url = reverse_lazy('account:login')

    def form_invalid(self, form):
        response = super().form_invalid(form)
        messages.error(self.request, 'username is already exists. please try another one.')
        if User.objects.filter(email=self.request.POST['email']).exists():
            messages.error(self.request, 'email is already exists. please try another one.')
            return redirect('account:register')
        return redirect('account:register')


# view profile page
class ViewProfile(UpdateView):
    queryset = UserProfile.objects.all()
    template_name = 'account/profile.html'
    form_class = UpdateInfoForm
    model = UserProfile
    slug_field = 'slug'
    slug_url_kwarg = 'user_slug'

    def get_success_url(self):
        return reverse_lazy('account:view_profile', kwargs={'user_slug': self.request.user.userprofile.slug})

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['info'] = UpdateInfoForm(instance=self.request.user.userprofile)
        user_prof = UserProfile.objects.get(user=self.request.user)
        context['user_prof'] = user_prof
        if self.request.POST:
            context['info'] = UpdateInfoForm(self.request.POST, instance=self.request.user.userprofile)
            if context['info'].is_valid():
                context['info'].save()
        context['get_favourite'] = User.objects.get(username=self.request.user.username).favorite.all()
        return context

    @method_decorator(login_required)
    def dispatch(self, request, *args, **kwargs):
        return super().dispatch(request, *args, **kwargs)

# приложение учетной записи urls.py

from django.urls import path
from . import views
from django.contrib.auth.views import (LoginView, LogoutView, PasswordResetCompleteView)
from django.urls import reverse_lazy
from django.contrib import messages
from django.shortcuts import redirect
app_name = 'account'


class LoginRedirect(LoginView):
    template_name = 'account/login.html'

    def get_success_url(self):
        return reverse_lazy('account:view_profile', args=[self.request.user.userprofile.slug])

    def form_invalid(self, form):
        response = super().form_invalid(form)
        messages.error(self.request, 'username or password are invalid. please try again.')
        return redirect('account:login')


urlpatterns = [
    # /account/login/
    path('login/', LoginRedirect.as_view(), name='login'),
    # /account/logout/
    path('logout/', LogoutView.as_view(template_name='account/logout.html', next_page=reverse_lazy('account:login')), name='logout'),
    # /account/register/
    path('register/', views.Register.as_view(), name='register'),
    # /account/view-profile/
    path('view-profile/<slug:user_slug>/', views.ViewProfile.as_view(), name='view_profile'),
    # /account/edit-profile/
    path('edit-profile/<slug:user_slug>/', views.EditView.as_view(), name='edit_profile'),
    # /account/password-change/
    path('password-reset/', views.PasswordReset.as_view(), name='password_reset'),
    # /account/password-change/done/
    path('password-reset-done/', views.PasswordResetDone.as_view(), name='password_reset_done'),
    # /account/password-copmlete/
    path('password-copmlete/', PasswordResetCompleteView.as_view(template_name='account/password_complete.html'),
         name='password_complete'),
    # /account/user-image/12/
    path('user-image/<slug:user_slug>/', views.UserImage.as_view(), name="user_image"),
    # /account/new-image/
    path('new-image/<slug:user_slug>/', views.UpdateAvatar.as_view(), name="add_avatar"),
    # /account/delete-user/medoabdin/
    path('delete-user/<slug:user_slug>/', views.remove_user, name="remove_user"),
]

# приложение сообщества
models.py

from django.db import models
from account.models import UserProfile
from django.contrib.auth.models import User
from django.utils import timezone
from django.template.defaultfilters import slugify
from django.urls import reverse

CHOICE = [('Technology', 'Technology'), ('Computer Science', 'Computer Science'),
          ('Lawyer', 'Lawyer'), ('Trading', 'Trading'),
          ('Engineering', 'Engineering'), ('Life Dialy', 'Life Dialy')
]


class UserAsking(models.Model):
    userprofile = models.ForeignKey(UserProfile, on_delete=models.CASCADE)
    title = models.CharField(max_length=100, blank=False, help_text='Be specific and imagine you’re asking a question to another person')
    question = models.TextField(max_length=500, blank=False, help_text='Include all the information someone would need to answer your question')
    field = models.CharField(max_length=20, choices=CHOICE, default='Technology', help_text='Add the field to describe what your question is about')
    date = models.DateTimeField(auto_now_add=True)
    ask_slug = models.SlugField(max_length=100)
    likes = models.ManyToManyField(User, related_name='likes', blank=True)
    dislikes = models.ManyToManyField(User, related_name='dislikes', blank=True)
    favorite = models.ManyToManyField(User, related_name='favorite', blank=True)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('community:question_view', kwargs={'user_slug': self.ask_slug})

    def save(self, *args, **kwargs):
        self.ask_slug = slugify(self.title)
        super().save(*args, **kwargs)

# приложение сообщества
question_view. html

<div class="col-sm-4">
                <div class="row">
                    <div class="users">
                        <div class="fl-right">
                            <div class="date-user-q">
                                <div class="avatar">
                                    <a href="{% url 'account:view_profile' my_question.userprofile.slug %}">
                                        <img class="img-rounded img-fluid" style="width: 50px;height:50px;display: inline-block" src="{{ my_question.userprofile.logo.url }}">
                                    </a>
                                </div>
                                <a href="{% url 'account:view_profile' my_question.userprofile.slug %}">{{ my_question.userprofile.user.first_name }}
                                {{ my_question.userprofile.user.last_name }}
                                </a>
                                <p class="">{{ userasking.date|time }}</p>
                            </div>
                        </div>
                    </div>
                </div>
            </div>

# приложение сообщества views.py

class QuestionDetail(DetailView, SingleObjectMixin):
    template_name = 'community/question_view.html'
    slug_field = 'ask_slug'
    slug_url_kwarg = 'user_slug'
    model = UserAsking
    queryset = UserAsking.objects.all()

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['my_question'] = UserAsking.objects.get(title=self.object)

# приложение сообщества
urls.py

from . import views
from django.urls import path

app_name = 'community'

urlpatterns = [
    path('', views.UserQuestions.as_view(), name='user_questions'),
    path('ask-question/', views.UserAskingView.as_view(), name='user_asking'),
    path('ask-question/question-view/<slug:user_slug>/', views.QuestionDetail.as_view(), name='question_view'),
    path('delete-post/<slug:user_slug>/', views.DeletePost.as_view(), name="delete_post"),
    path('update-post/<slug:user_slug>/', views.UpdatePost.as_view(), name="update_post"),
    path('delete-comment/<int:pk>/', views.DeleteComment.as_view(), name="delete_comment"),
    path('update-comment/<int:pk>/', views.UpdateComment.as_view(), name="update_comment"),
    path('like/<slug:user_slug>/', views.LikePost.as_view(), name="like"),
    path('dislike/<slug:user_slug>/', views.DisLikePost.as_view(), name="dislike"),
    path('like-comment/<int:pk>/', views.LikeComment.as_view(), name="like_comment"),
    path('favourite/<slug:user_slug>/', views.AddFavorite.as_view(), name="favourite"),
]

Примечание: я дал вам код, связанный только с этой проблемой

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...