Django模型表单,一个字段与另一个模型,更新两个模型中的字段

2024-05-19 19:48:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用django.contrib.auth.models User model。我还有另一个名为UserProfile的类,它本质上是django用户模型的扩展。在

class UserProfile(models.Model):
    user = models.OneToOneField(User, related_name='userprofile', primary_key=True)
    age = models.CharField(max_length=3, blank=True)
    shortbio = models.CharField(max_length=400, blank=True)

所以我希望有一个基于UserProfile模型的表单,但也要集成现有的字段,比如User类的名字和姓氏。并允许我以一种形式更新UserProfile和{}的两个字段。我该怎么做?在


Tags: django用户模型authtruemodelmodelscontrib
2条回答

有三个步骤来实现这一点。我昨天碰巧做了一件很相似的事。首先是模型,然后是视图,然后是模板。在

型号:

这段代码确保当用户注册时,也会生成一个新的配置文件。将此代码添加到不带制表符的UserProfile下。在

# This will ensure the profile is made when a user is created
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        UserProfile.objects.create(user=instance)

视图:

我假设这张表格是登记的,就像我的一样。这(对我来说)需要很多代码,因为您需要做一些事情。(1) 保存新用户。(2) 设置新的用户配置文件(3)保存用户配置文件

^{pr2}$

注意:这个代码应该是相似的,即使它不是为寄存器。不管怎样,你基本上都需要重置。在

模板:

这很简单。在中创建您自己的用户窗体和配置文件窗体表单.py然后将它们返回到视图函数。注意最后一行的***。然后在模板中添加:

<h4>Register for an Account</h4>
{% if error_message %}
     <p><strong>{{ error_message }}</strong></p>
{% endif %}

<form class="form-horizontal" role="form" action="" method="post" enctype="multipart/form-data">
   {% csrf_token %}
   {{form1}}
   {{form2}}
   <br>
   <div class="form-group">
       <div class="col-sm-offset-2 col-sm-10">
             <button type="submit" class="btn btn-success">Submit</button>
       </div>
   </div>
</form>

有一些方法可以做到,这里有一个:

网址:

from app import views
from app import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^complementary/', views.complementary)
]

型号:

^{pr2}$

视图:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.shortcuts import redirect
from django.shortcuts import render

from app.forms import UserEditForm, ProfileEditForm
from app.models import UserProfile


# Create your views here.
def complementary(request):
    profile = UserProfile.objects.get(user_p=1)
    user_form = UserEditForm(instance=request.user)
    profile_form = ProfileEditForm(instance=request.user)

    if request.method == 'POST':
        user_form = UserEditForm(instance=request.user,
                                 data=request.POST)
        profile_form = ProfileEditForm(instance=request.user.usuario,
                                       data=request.POST,
                                       files=request.FILES)

        if user_form.is_valid() and profile_form.is_valid():
            user_form.save()
            profile_form.save()
            return redirect('redirect_url')

    dic = {'profile': profile,
           'user_form': user_form,
           'profile_form': profile_form}

    return render(request, 'template.html', dic)

表格:

# -*- coding: utf-8 -*-
from django import forms
from django.contrib.auth.models import User
from django.core.validators import RegexValidator
from app.models import UserProfile


class UserEditForm(forms.ModelForm):
    # Regex for non-digits
    name_val = [RegexValidator(r'^[a-zA-ZÀ-Ÿ_]+( [a-zA-ZÀ-Ÿ_]+)*$',
                               message='Non-digits',
                               code='invalid_name')]

    first_name = forms.CharField(
        label='Name *',
        validators=name_val,
        widget=forms.TextInput(attrs={'placeholder': 'Name: '})
    )
    last_name = forms.CharField(
        label='Last Name *',
        validators=name_val,
        widget=forms.TextInput(attrs={'placeholder': 'Last Name: '})
    )

    class Meta:
        model = User
        fields = ('first_name', 'last_name', 'email')


class ProfileEditForm(forms.ModelForm):
    class Meta:
        model = UserProfile
        exclude = 'id',

模板.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    {{ profile.shortbio }}
    <form role="form" method="post" id="custom-form">
        {% csrf_token %}
        {{ user_form.as_p }}
        {{ profile_form.as_p }}
        <button type="submit"></button>
    </form>
</body>
</html>

相关问题 更多 >