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
, и таким образом избежать необходимости работать с двумя моделями.