Два формуляра в единственном виде Джанго - CreateView

я стараюсь создавать единственный формуляр для одного 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 он не обязательно для этого и мне это не совсем ясно.

Привет!

2
задан 02.09.2016, 17:30
2 ответа

Помни, что в Джанго, мы призываем 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.

2
ответ дан 24.11.2019, 13:30
  • 1
    Я попробую то, что ты говоришь в понедельник спасибо за ответ < 3, но которого он передает тебе в со вторым замечанием, ты говоришь использования единственного ModelForm или как? –  ikenshu 04.09.2016, 02:28
  • 2
    Единственная модель User и ах и # 237; добавлять поля, которые ты помещаешь в модель UserProfile. –  toledano 04.09.2016, 02:31
  • 3
    Я не понимаю тебя очень хорошо, потому что модель, которая у меня есть, увеличивает модели Усер де Джанго, или ты говоришь делать один custom? x.x sorry сомнения –  ikenshu 04.09.2016, 02:38
  • 4
    Удали, отвергни модель UserProfile. Это не используй м и # 225; в. Используй только модель User. –  toledano 04.09.2016, 03:35

Хорошие, чтобы работать с классом 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.'))

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

Привет.

1
ответ дан 24.11.2019, 13:30
  • 1
    Спасибо за ответ! Ты говоришь создания только формуляра для реестра и despu и # 233; s показывать один в профиле, чтобы обновлять другие поля, туз и # 237; tambi и # 233; n podr и # 237; чтобы быть не? –  ikenshu 05.09.2016, 16:50