Django как вернуться к автосозданной странице

У меня есть модель CustomUser и модель UserProfile. UserProfile связан с CustomUser через внешний ключ. Новый UserProfile автоматически создается каждый раз, когда создается новый CustomUser.

После добавления нового CustomUser я хочу попасть на страницу UserProfile, чтобы человек, добавляющий пользователя, мог также редактировать его профиль. Я не смог понять, как указать идентификатор UserProfile в представлении для добавления нового пользователя

Модели:

class UserProfile(models.Model):
    user = models.OneToOneField(CustomUser, null=True, on_delete=models.CASCADE)
    preferred_name = models.CharField(null=True, blank=True, max_length= 75)
    pronouns = models.CharField(null=True, blank=True, max_length= 40)
    phone = PhoneField(blank=True, help_text='Contact phone number')
    job_title = models.CharField(null=True, blank=True, max_length= 75)
    birthdate = models.DateField(null=True, blank=True)
    bio = tinymce_models.HTMLField(null=True, blank=True)
    profile_image = ConstrainedFileField(
        null=True,
        blank=True,
        upload_to='projects/employee_profiles',
        content_types=['image/png', 'image/jpg', 'image/jpeg', 'image/gif'],
        max_upload_size=2097152,
    )

    def create_user_profile(sender, instance, created, **kwargs):
      if created:
            UserProfile.objects.create(user=instance)

   post_save.connect(create_user_profile, sender=CustomUser)


class CustomUser(AbstractUser):
    full_name = models.CharField(max_length=250, null=True)
    age = models.PositiveIntegerField(null=True, blank=True)
    employee_type = models.ForeignKey(Group, null=True, on_delete=models.SET_NULL, default=1)
    is_active = models.BooleanField(null=False, default=True)

Вид:

class AddCompanyEmployee(CreateView):
    model = CustomUser
    template_name = 'manage/add_employee.html'
    form_class = AddCompanyEmployeeForm

    def get_success_url(self):
        return reverse('userprofile_detail', args=[self.kwargs.get('userprofile_pk')])

Форма:

class AddCompanyEmployeeForm(UserCreationForm):
    class Meta:
        model = CustomUser
        fields = UserCreationForm.Meta.fields + ('email', 'full_name', 'age',)

URL профиля пользователя:

from django.urls import path
from .views import EmployeeDirectory, UserProfileDetailView

urlpatterns = [
    path('', EmployeeDirectory.as_view(), name='directory'),
    path('profile/<int:pk>', UserProfileDetailView.as_view(), name='userprofile_detail'),
]

Вот ошибка, которую я получаю при добавлении нового пользователя:

NoReverseMatch at /manage/add_employee/
Reverse for 'userprofile_detail' with arguments '(None,)' not found. 2 pattern(s) tried: ['user\\-profiles/profile/(?P<pk>[0-9]+)\\Z', 'directory/profile/(?P<pk>[0-9]+)\\Z']

Вы можете работать с:

class AddCompanyEmployee(CreateView):
    model = CustomUser
    template_name = 'manage/add_employee.html'
    form_class = AddCompanyEmployeeForm

    def get_success_url(self):
        return reverse(
            'userprofile_detail', kwargs={'pk': self.object.userprofile.pk}
        )

Он будет искать OneToOneField в обратном направлении, и таким образом получит .pk связанного UserProfile.

При этом довольно странно, что вы используете одновременно a CustomUser и UserProfile. Обычно, если вы реализуете свою собственную модель пользователя, это делается для того, чтобы добавить поля, которые в противном случае вы бы хранили в UserProfile, и таким образом избежать необходимости работать с двумя моделями.

Вернуться на верх