Formulaire avec Django

django, python

a marqué ce sujet comme résolu.

Bonjour ! :)

Je suis en train d’apprendre à utiliser Django. Je réalise donc un petit projet pour m’entraîner, mais je rencontre un problème avec les formulaire.

J’ai une table "order" qui contient un champs "date_update" qui ne peut pas être à NULL.

J’ai aussi un formulaire qui permet de créer un Order. Dans ce formulaire, je ne souhaite pas que l’utilisateur puisse renseigner la date d’update. J’ai donc caché ce champs. Mais du coup, il est toujours égal à NULL, ce qui me cause une erreur lors de l’enregistrement dans la base de données.

Voici mon code :

models.py

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
from django.db import models

class Vehicle(models.Model):
  name = models.CharField(max_length=255)

  class Meta:
      verbose_name_plural = "Vehicles"

  def __str__(self):
      return self.name

class Category(models.Model):
  name = models.CharField(max_length=255)

  class Meta:
      verbose_name_plural = "Categories"

  def __str__(self):
      return self.name

class Status(models.Model):
  name = models.CharField(max_length=255)
  color = models.CharField(max_length=255)

  class Meta:
      verbose_name_plural = "Satutes"

  def __str__(self):
      return self.name

class Order(models.Model):
  vehicle = models.ForeignKey(Vehicle, on_delete=models.DO_NOTHING)
  category = models.ForeignKey(Category, on_delete=models.DO_NOTHING)
  description = models.CharField(max_length=255)
  quantity = models.IntegerField()
  price = models.FloatField(blank=True, null=True)
  provider = models.CharField(blank=True, null=True, max_length=255)
  user_comment = models.CharField(blank=True, null=True, max_length=255)
  admin_comment = models.CharField(editable=False, max_length=255)
  user = models.CharField(editable=False, max_length=255)
  status = models.ForeignKey(Status, editable=False, on_delete=models.DO_NOTHING)
  date_update = models.DateTimeField(editable=False)

  class Meta:
      verbose_name_plural = "Orders"

  def __str__(self):
      return self.description

`

forms.py

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
from django import forms
from datetime import datetime
from .models import Vehicle, Category, Order

class OrderForm(forms.ModelForm):
  
  class Meta:
      model = Order
      fields = '__all__'

  def __init__(self, *args, **kwargs):
      super(OrderForm, self).__init__(*args, **kwargs)
      for visible in self.visible_fields():
          visible.field.widget.attrs['class'] = 'form-control'

views.py

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from django.shortcuts import render, redirect
from datetime import datetime
from .models import Order
from .forms import OrderForm

def index(request):
  orders = Order.objects.order_by('-date_update').all()

  return render(request, 'order/index.html', {
      'orders':orders,
  })

def add(request):
  if request.method == 'POST':
      form = OrderForm(request.POST, initial={'date_update':datetime.now()})

      if form.is_valid():
          form.save()

          return redirect('order_index')
  else:
      form = OrderForm(initial={'date_update':datetime.now()})

  return render(request, 'order/add.html', {
      'form':form,
  })

`

order/add.html

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
{% extends 'layout.html' %}


{% block css %}
  
{% endblock %}


{% block body %}
  <a href="{% url 'order_index' %}" class="btn btn-primary">Retour aux commandes</a>

  <br><br>

  {{ form.non_field_errors }}

  <form method="post" action="{% url 'order_add' %}">
      {% csrf_token %}

      {% for field in form %}
          <div class="form-group">
              {{ field.label_tag }}
              {{ field }}
          </div>
      {% endfor %}

      <input type="submit" name="submit" class="btn btn-primary">
  </form>
{% endblock %}


{% block js %}
  
{% endblock %}

J’ai donc plusieurs problèmes.

Le premier, c’est que mon date_update est toujours égal à NULL, alors que j’ai bien mit initial={'date_update':datetime.now(). Je ne sais pas pourquoi.

Ensuite, mes messages d’erreur du formulaire ne s’affichent pas. Je ne sais pas comment faire.

Pouvez-vous m’aider ?

Merci ! :)

+0 -0

Salut !

Il y a une solution toute simple (mais pas forcément évidente a priori) à ce problème. Quand tu as besoin d’un champ qui permette d’horodater la dernière sauvegarde d’un objet, tu peux lui rajouter le paramètre auto_now=True. Voici la doc à ce sujet. ;)

Oh, et quand tu utilise ce paramètre, tu n’as pas besoin de définir editable=False.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte