简体   繁体   中英

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

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

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

views.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

form.py

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

views.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})

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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