Модель профиля Данные не сохраняются, когда я пытаюсь создать пользователя и профиль одновременно - PullRequest
0 голосов
/ 22 апреля 2020

Когда я пытаюсь создать нового пользователя, я также хочу создать его профиль одновременно. Но нет данных, поступающих из формы профиля. Пользователь создан, но в форме создания профиля я получаю сообщение об ошибке. Вот мой models.py

class Profile(models.Model):
   user = models.OneToOneField(User, on_delete=models.CASCADE)
   StudentID = models.IntegerField(primary_key=True, verbose_name='SID')
   image = models.ImageField(default='default.jpeg', upload_to='profile_pics', blank=True)
   def __str__(self):
       return self.Branch
   def save(self, *args, **kwargs):
       super(Profile, self).save(*args, **kwargs)
       img = Image.open(self.image.path)
       if img.height > 300 or img.width > 300:
           output_size = (300, 300)
           img.thumbnail(output_size)
           img.save(self.image.path)

forms.py

class UserRegisterForm(UserCreationForm):

    email = forms.EmailField()
    first_name = forms.CharField()
    last_name = forms.CharField()

    class Meta:
        model = User
        fields = ['username', 'email', 'first_name', 'last_name', 'password1', 'password2']

class ProfileCreationForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields = ['StudentID', 'Branch', 'YearOfStudy', 'ContactNumber']

views.py, когда я пытаюсь напечатать StudentID, я получаю значение None. Я думаю, что есть потеря данных.

def register(request):
    print("hello")
    if request.method == 'POST':
        form = UserRegisterForm(request.POST)
        form1 = ProfileCreationForm(request.POST)
        if form.is_valid() and form1.is_valid():
            user = form.cleaned_data.get('username')
            StudentID = form.cleaned_data.get('StudentID')
            print(StudentID)
            profile = form1.save(commit=False)
            profile.user = user
            form.save()
            profile.save()
            messages.success(request, f'Your account has been created! You are now able to log in')
            print("reached here")
            return redirect('login')
    else:
        form = UserRegisterForm()
        form1 = ProfileCreationForm()
    context = {
        'form': form,
        'form1': form1
    }
    return render(request, 'user/register.html', context)

регистр. html

{% block content %}
    <div class="content-section">
        <form method="POST">
            {% csrf_token %}
            <fieldset class="form-group">
                <legend class="border-bottom mb-4">JOIN TODAY</legend>
                {{ form|crispy }}
                {{ form1|crispy }}
            </fieldset>
            <div class="form-group">
                <button class="btn btn-outline-info" type="submit">Sign Up</button>
            </div>
        </form>
        <div class="border-top pt-3">
            <small class="text-muted">Already have an account?<a class="ml-2" href="{% url 'login' %}">Sign In</a></small>
        </div>
    </div>
{% endblock content %}

Ответы [ 2 ]

0 голосов
/ 22 апреля 2020

Помимо того, на что указал @Iain, я думаю, что ваш код в представлениях имеет некоторые проблемы после запуска is_valid. Попробуйте исправить это так:

if form.is_valid() and form1.is_valid():    
    profile = form1.save(commit=False)
    user = form.save()
    profile.user = user
    profile.save()
    messages.success(request, 'Your account has been created! You are now able to log in')
    return redirect('login')

Позвольте мне объяснить, почему вы можете получить ошибку, то есть profile.user это User экземпляр, а не строка. Так что ставить username не получится. Но вы можете получить пользовательский объект при сохранении формы. Как и user=form.save(), так что используйте это в profile.user.

0 голосов
/ 22 апреля 2020

StudentID включено form1 не form

StudentID = form1.cleaned_data.get('StudentID')
print(StudentID)

Вы также должны сначала сохранить User, поскольку это обязательное отношение для Profile модели

user = form.save()
profile = form1.save(commit=False)
profile.user = user
profile.save()
...