【问题标题】:Model is not throwing(Saving) data to the backend in Django模型没有向 Django 中的后端抛出(保存)数据
【发布时间】:2021-06-01 17:04:43
【问题描述】:

这是更新用户信息的功能。

views.py

    def UpdateProfile(request):
        context = {}
        user = request.User
        if not user.is_authenticated:
            return redirect('login')
        if request.POST:
            form = PersonalInfo(request.POST, instance=user)
            if form.is_valid():
                obj = form.Save(commit=False)
                user = user.id
                obj.user = user
                obj.save()
                return redirect('profile')
            else:
                #messages.error(request, ('Please correct the error below.'))
                context['personal_form'] = form
        else:
            form = PersonalInfo(instance=user)
            context['personal_form'] = form
        return render(request, 'admission/signup.html', context)

这是我创建的用于存储用户信息的模型。

models.py:

class ApplicantInfo(models.Model):
    infield = models.AutoField(primary_key=True)
    first_name = models.CharField(max_length=20)
    last_name = models.CharField(max_length=20)
    profile_pic = models.ImageField(upload_to='media/', blank= True, null= True)
    father_name = models.CharField(max_length=30)
    user = models.OneToOneField(User, on_delete=models.CASCADE)

这是我创建的表单类。

forms.py:

from .models import Applicant, ApplicantInfo
from django import forms

class PersonalInfo(forms.ModelForm):
    
    class Meta:
        model = ProfileInfo
        fields = [
            'first_name',
            'last_name',
            'profile_pic',
            #'date_birth',
            'father_name',
            'street_adr',
            'city',
            'zip_code',
        ] 

这是我创建的前端模板,工作正常。

模板


    {%block content%}
    <!DOCTYPE html>
    <html>
        <head>
    
        </head>
        <body>
            <form method="POST">
                {% csrf_token %}
                {% for field in personal_form %}
                    <p>
                        {{field.label_tag}}
                        {{field}}
    
                    {% if field.help_text %}
                        <small style="color:gray">{{field.help_text}}</small>
                    {% endif %}
                    </p>
                {% endfor %}
                {% for field in personal_form %}
                    <p>
                        {% for error in field.errors %}
                            <p style="color:red">{{error}}</p>
                        {% endfor %}
                    </p>
                {% endfor %}
                <button type="submit">Submit</button>
            </form>
            </body>
    </html>
    {% endblock content %}

该应用已经能够毫无问题地加载表单,但它只是没有将数据扔到后端。

【问题讨论】:

  • 你想在模板中访问什么?
  • 我想将用户数据存储在后端。就是这样
  • @AsifIqbal 你没有收到类似“ModelForm has no model class specified.”的错误吗?或者,如果这不是您的表单PersonalInfo 的完整代码,请添加它。另请在问题中添加模板的相关部分。
  • @AbdulAzizBarkat,我没有收到任何错误,并且还完成了更多表单,因为我已经在表单类 PersonalInfo 中放置了模型和字段。我还能够从管理面板保存用户数据。
  • @AbdulAzizBarkat 我已更新表单代码。请看一看。

标签: python mysql django django-models frontend


【解决方案1】:

UpdateProfile 的更新函数

views.py

    def UpdateProfile(request, id=None):
        context = {}
        user_obj = request.user
        if not user_obj.is_authenticated:
            return redirect('login')
        
        if request.method == "POST":
            form = PersonalInfo(request.POST)
            if form.is_valid():
                obj = form.save()
                user_id = Applicant.objects.filter(app_id = user_obj.app_id).first()
                obj.user = user_id
                obj.save()
                return redirect('profile')
            else:
                #messages.error(request, ('Please correct the error below.'))
                context['personal_form'] = form
        elif request.method == 'GET':
            form = PersonalInfo(instance=user_obj)
            context['personal_form'] = form
        return render(request, 'admission/signup.html', context)

forms方法更新代码,只添加#def clean_data函数

forms.py


    class PersonalInfo( forms.ModelForm):
    
        class Meta:
            model = ProfileInfo
            fields = [
                'first_name',
                'last_name',
                'profile_pic',
                #'date_birth',
                'father_name',
                'street_adr',
                'city',
                'zip_code',
            ] 
        def clean(self):
            if self.is_valid():
                first_name = self.cleaned_data['first_name']
                last_name = self.cleaned_data['last_name']
                father_name = self.cleaned_data['father_name']
                street_adr = self.cleaned_data['street_adr']
                city = self.cleaned_data['city']
                zip_code = self.cleaned_data['zip_code']

并且模型不需要更改,您可以选择添加自动字段(PrimaryKey)或使用默认值

问题出在 view.py 中,我刚刚从表单对象中删除了实例属性,然后我从用户模型(在本例中为 #Applicant 模型)调用 user_id,然后分配给 obj 对象和保存了 obj。

感谢所有在这个问题上花费宝贵时间的人。 干杯!!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-03
    • 2014-01-08
    • 1970-01-01
    • 2015-05-06
    • 2021-03-31
    • 1970-01-01
    • 2019-03-29
    • 1970-01-01
    相关资源
    最近更新 更多