Django模型表单在表单提交时未将数据保存到数据库模型

时间:2021-02-11 12:16:09

标签: django django-models django-forms

我已经创建了一个项目并在模型中添加了模型,还在 forms.py 中创建了一个表单。我正在尝试使用 commit=False 修改一些值。在提交表单时,它不会将数据保存到数据库中,并且代码也不会抛出任何错误。我不知道如何解决这个问题。

模型.py

from django.db import models
from django.contrib.auth.models import User


class Agent(models.Model):
    name = models.CharField(max_length=255)
    id_no = models.CharField(max_length=20)
    address = models.CharField(max_length=255)
    gender = models.CharField(max_length=8)
    age    = models.IntegerField()
    agent_no = models.CharField(unique=True, max_length=12, null=True)
    email = models.EmailField(max_length=50)
    date_created = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"{self.name}"


class Company(models.Model):
    user = models.OneToOneField(User, null=True, on_delete=models.CASCADE)
    name = models.CharField(max_length=255, null=True, blank=True)
    address = models.CharField(max_length=255, null=True, blank=True)
    telephone = models.IntegerField( null=True, blank=True)
    email = models.EmailField(max_length=50, null=True, blank=True)
    date_created = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"{self.name}"


class Task(models.Model):
    company = models.ForeignKey(Company, null=True, on_delete=models.SET_NULL)
    agent = models.ForeignKey(Agent, null=True, on_delete=models.SET_NULL)
    cargo = models.CharField(max_length=200)
    document = models.FileField(upload_to='documents/')
    quantity = models.FloatField()
    amount = models.FloatField()
    duty = models.FloatField(null=True, blank=True)
    status = models.CharField(max_length=50, default='Pending')
    date_created = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"{self.cargo}"

forms.py

from django.contrib.auth.models import User
from django import forms
import re
from django.core.exceptions import ValidationError
from .models import *

class TaskForm(forms.ModelForm):
    cargo = forms.CharField( required=False)
    document = forms.FileField()
    quantity = forms.FloatField()
    amount = forms.FloatField()

    class Meta:
        model = Task
        fields = ['cargo', 'document', 'quantity', 'amount']

views.py

from django.contrib.auth.decorators import login_required
from django.shortcuts import render
from .forms import *
from django.contrib.auth.models import Group
from django.contrib.auth import login, authenticate


@login_required(login_url='/login/')
def task(request):
    if request.method == "POST":
        form=TaskForm(request.POST)
        if form.is_valid():
            m = form.save(commit=False)
            m.status ='Pending'
            m.company = request.user.username
            m.save()
 

    else:
        form= TaskForm(None)
    context = {'form':form}
    return render(request, 'registration/templates/task.html', context)

模板.html

{% extends 'base.html' %}
{% load crispy_forms_tags %}
{% block content %}

<form action="" method="post">
    {% csrf_token %}
    <div class="container my-2 d-flex" style="align-items:center; justify-content:center;">
        <div class="card d-flex" style="width:70%; align-items:center; justify-content:center;">
            <div class="form-control pt-3 " style="text-transform:uppercase;color:green"><h5>Upload trip information
                </h5>
            </div>
            <div class="card-body" style="width:98%">
                {{ form|crispy}}
            </div>
              <div class="card-footer" style="width:98%">
                  <input type="submit" value="Upload Information" class="btn btn-outline-secondary btn-sm">
            </div>
        </div>
    </div>
</form>
{% endblock %}

1 个答案:

答案 0 :(得分:0)

from django.contrib.auth.decorators import login_required
from django.shortcuts import render
from django.urls import reverse
from django.http import HttpResponseRedirect
from .forms import *
from django.contrib.auth.models import Group
from django.contrib.auth import login, authenticate


@login_required(login_url='/login/')
def task(request):
    if request.method == "POST":
        form=TaskForm(request.POST,request.FILES) # this is important if you are dealing with files
        if form.is_valid():
            m = form.save(commit=False)
            m.status ='Pending'
            m.company = request.user.username
            m.save()
            return HttpResponseRedirect(reverse(' the url of where you want to redirect the user '))

    else:
        form= TaskForm()
    context = {'form':form}
    return render(request, 'registration/templates/task.html', context)

并在您的模板中尝试在表单中添加 enctype。

{% extends 'base.html' %}
{% load crispy_forms_tags %}
{% block content %}

<form action="" method="post" enctype="multipart/form-data">
    {% csrf_token %}
    <div class="container my-2 d-flex" style="align-items:center; justify-content:center;">
        <div class="card d-flex" style="width:70%; align-items:center; justify-content:center;">
            <div class="form-control pt-3 " style="text-transform:uppercase;color:green"><h5>Upload trip information
                </h5>
            </div>
            <div class="card-body" style="width:98%">
                {{ form|crispy }}
            </div>
              <div class="card-footer" style="width:98%">
                  <input type="submit" value="Upload Information" class="btn btn-outline-secondary btn-sm">
            </div>
        </div>
    </div>
</form>
{% endblock %}