#django #django-models
#django #django-модели
Вопрос:
У меня есть две модели, которые расширяют auth.models.User
django с one-to-one
отношением между моделью и пользователем. Я хочу создать объекты любого из этих двух, используя форму.
две модели :
class Worker(models.Model):
address = models.CharField(max_length=400)
user = models.OneToOneField(User, on_delete=models.CASCADE)
@receiver(post_save, sender=User)
def create_user_worker(sender, instance, created, **kwargs):
if created:
Worker.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_user_worker(sender, instance, **kwargs):
instance.worker.save()
class Employer(models.Model):
address = models.CharField(max_length=400)
user = models.OneToOneField(User, on_delete=models.CASCADE)
@receiver(post_save, sender=User)
def create_user_employer(sender, instance, created, **kwargs):
if created:
Employer.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_user_employer(sender, instance, **kwargs):
instance.employer.save()
И у меня есть функция просмотра создателя как:
def worker_sign_up(request):
if request.method == 'POST':
form = WorkerSignUpForm(request.POST)
if form.is_valid():
user = form.save(commit=False)
user.employer = None
user.worker = Worker()
user.worker.address= form.cleaned_data.get('address')
user.save()
raw_password = form.cleaned_data.get('password1')
user = authenticate(username=user.username, password=raw_password)
login(request, user)
return redirect('home')
else:
form = WorkerSignUpForm()
return render(request, 'registration/workersignup.html', {'form': form})
Я ожидаю user
, что в моей базе данных будут a worker
и a , но он создает оба Worker
Employer
объекта and .
ps. Мой класс формы:
class WorkerSignUpForm(UserCreationForm):
address = forms.CharField(max_length=400)
class Meta:
model = User
fields = ('username', 'first_name', 'last_name', 'email', 'password1', 'password2')
Ответ №1:
Это потому, что вы связываете Employer
объект и сохраняете User
. Вместо использования user.save()
используйте user.worker.save()
. Это не создаст никакого объекта для Employer
.
#views.py
def worker_sign_up(request):
if request.method == 'POST':
form = WorkerSignUpForm(request.POST)
if form.is_valid():
user = form.save() #save the user
user.worker = Collector() # not sure why you need this
user.worker.address= form.cleaned_data.get('address')
user.worker.save() # this will create an object for Worker only
raw_password = form.cleaned_data.get('password1')
user = authenticate(username=user.username, password=raw_password)
login(request, user)
return redirect('home')
else:
form = WorkerSignUpForm()
return render(request, 'registration/workersignup.html', {'form': form})
Кроме того, вам нужно сделать OneToOne
поле необязательным.
# models.py
class Worker(models.Model):
address = models.CharField(max_length=400)
user = models.OneToOneField(User, on_delete=models.CASCADE, null=True, blank=True
)
class Employer(models.Model):
address = models.CharField(max_length=400)
user = models.OneToOneField(User, on_delete=models.CASCADE, null=True, blank=True
)
Комментарии:
1. по-прежнему создает как «работодателя», так и «работника» в базе данных.
2. Все еще не работает. Кажется, «работодатель» создается на
user = form.save()
3. Может быть возможно. Можете ли вы также поделиться своей формой?