简体   繁体   English

Django 用外键保存表格

[英]Django save form with foreign key

I am currently trying to create a form where users get to fill in their details after creating an account.我目前正在尝试创建一个表单,用户可以在创建帐户后填写他们的详细信息。 The idea is that every user, after registration, gets redirected to this form page to fill it out.这个想法是每个用户在注册后都会被重定向到这个表单页面来填写它。 To achieve this, i'm using foreign keys.However it doesn't save to database.为此,我使用外键。但是它不会保存到数据库中。

models.py模型.py

class User(AbstractUser):
    pass
    def __str__(self):
        return self.username

class Detail(models.Model):
   user = models.ForeignKey(User, on_delete=models.CASCADE, null=False, default="")
   first_name = models.CharField(max_length=200, default="")
   last_name = models.CharField(max_length=255, default="")

   class Meta:
        verbose_name_plural = "Detail"

   def __str__(self):
    return self.first_name+ " "+self.last_name

forms.py forms.py

class Details(forms.ModelForm):
   class Meta:
    model = Detail
    fields = "__all__"
    widgets={
        "user": forms.TextInput()
    }

views.py视图.py

def details(request):
    if request.method =="POST":
        form = Details(request.POST)
        if form.is_valid():
            detail = form.save(commit=False)
            detail.user = request.user
            detail.first_name = detail.first_name.lower()
            detail.last_name = detail.last_name.lower()
            detail.save()
            return redirect("admin:index")
    else:
        form = Details(initial={"user":request.user.username})
    return render(request, "details.html", {"form":form})

You need to exclue user field from ModelForm like this您需要像这样从ModelForm中排除用户字段

form.py表单.py

class Details(forms.ModelForm):
   class Meta:
    model = Detail
    fields = "__all__"
    exclude =["user"]

views.py视图.py

def details(request):
    if request.method =="POST":
        form = Details(request.POST)
        if form.is_valid():
            detail = form.save(commit=False)
            detail.user = request.user
            detail.first_name = detail.first_name.lower()
            detail.last_name = detail.last_name.lower()
            detail.save()
            return redirect("admin:index")
    else:
        form = Details()
    return render(request, "details.html", {"form":form})

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM