я стараюсь создавать единственный формуляр для одного user
у которого были поля обоих формуляров, так user
как userprofile
что верит, чтобы увеличивать модель.
models.py
from django.db import models
from django.forms import ModelForm
from django.contrib.auth.models import User
class UserProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
date_of_birthday = models.DateField()
address = models.TextField()
phone_number = models.CharField(max_length=11)
def __str__(self):
return self.user.first_name
class UserProfileForm(ModelForm):
class Meta:
model = UserProfile
fields = '__all__'
class UserForm(ModelForm):
class Meta:
model = User
fields = ['username', 'first_name', 'last_name', 'email', 'password']
views.py
from django.shortcuts import render
from django.views.generic import CreateView
from .models import UserProfile, UserProfileForm, UserForm
class UserProfileCreateView(CreateView):
model = UserProfile
template_name = 'userprofiles/user_create.html'
success_url = '/'
form_class = UserProfileForm
def form_valid(self, form):
form.save()
return super(UserCreate, self).form_valid(form)
class UserCreateView(CreateView):
model = UserProfile
template_name = 'userprofiles/user_create.html'
success_url = '/'
form_class = UserForm
def form_valid(self, form):
form.save()
return super(UserCreate, self).form_valid(form)
вид, здесь используя form
он показывает мне в обоих тот же формуляр, который является формуляром модели User
который приносит Джанго.
<form action="{% url 'users:user_create' %}" method="post">
{% csrf_token %}
{{ form.as_p }}
{{ form.as_p }}
<button type="submit">Crear Usuario</button>
</form>
Я знаю, что он возможно смог делаться с formset
или с prefix
вида, основанного на классе, но я верю в то, что prefix
он не обязательно для этого и мне это не совсем ясно.
Привет!
Помни, что в Джанго, мы призываем form
к формулярам по привычке , но, также как и не может быть двух пользователей ikenshu в том же сайте, не моги быть двух так называемых формуляров form
в виде.
Ничто не запрещает тебе звонить в первый формуляр unicornio
и во второго dragon
.
Итак, формуляры - объекты, инстанции класса Form
, следовательно ты они можешь добавлять к контекст из вида.
PodrГ-Схвати пробовать этот ответ StackOverflow: https://stackoverflow.com/questions/15497693/django-can-class-based-views-accept-two-forms-at-
И использовав это, harГ-схвати что-то как это:
from django.shortcuts import render
from django.views.generic import CreateView
from .models import UserProfile, UserProfileForm, UserForm
class UserProfileCreateView(MultiFormsView):
template_name = 'userprofiles/user_create.html'
success_url = '/'
form_class = {
'dragon': UserProfileForm,
'unicornio': UserForm
}
Важное Замечание :
Восток пример не считает форму, в которой формуляры санкционируются.
Замечает 2: Считай возможность использовать модель вместо двух, увеличивая модель
User
с полями, которые ты используешь в моделиProfile
.
Хорошие, чтобы работать с классом profile, ты был бы должен думать о виде обновления и не создания profile. Чтобы создавать profile, просто ты должен производить новую инстанцию, когда будет работать signal post_save user, оно могло бы быть нечто похожим:
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
instance.profile.save()
Относительно вида обновления я произведу ее начиная с View, так как решение этого типа проблем увидено лучше:
class ProfileView(View):
def get(self, request):
user_form = UserForm(instance=request.user)
profile_form = UserProfileForm(instance=request.user.profile)
return render(request, 'profiles/profile.html', {
'user_form': user_form,
'profile_form': profile_form
})
def post(self, request):
user_form = UserForm(request.POST, instance=request.user)
profile_form = UserProfileForm(request.POST, instance=request.user.profile)
if user_form.is_valid() and profile_form.is_valid():
user_form.save()
profile_form.save()
messages.success(request, _('Your profile was successfully updated!'))
return redirect('settings:profile')
messages.error(request, _('Please correct the error below.'))
Я надеюсь, что он служил тебе помощью, в следующей ссылке я оставляю тебе больше информации на как увеличивать пользователи Джанго.
Привет.
User
и ах и # 237; добавлять поля, которые ты помещаешь в модельUserProfile
. – toledano 04.09.2016, 02:31UserProfile
. Это не используй м и # 225; в. Используй только модельUser
. – toledano 04.09.2016, 03:35