Django автоматически добавляет число в таблицу

Я хочу, чтобы когда я добавляю файл в таблицу, он автоматически добавлял число от 1. Я не могу использовать первичный ключ в модели, потому что я уже использую его. у кого-нибудь есть решение. спасибо.

====Page.html====

<h5>Documents</h5>
</div>
<div class="row">
  <div class="col-md">
    <div class="card card-body">
      <table class="table table-sm">
        <tr>
          <th>#</th>
          <th>Nom du fichier</th>
          <th>Fichier</th>
          <th></th>
        </tr>

        {% for d in document %}
        <tr>
            <td>{{d.Number}}</td>
            <td>{{d.Description}}</td>
            <td><a download href="{{d.Fichier.url}}">{{d.Fichier}}</a></td>
            <td><a class="btn btn-outline-danger" href="{% url 'supprimerdocument' d.id %}">Supprimer</a>
         </tr>
        {% endfor %}
      </table>
    </div>
  </div>
</div>

====view.py====

# Button to add docs
@login_required(login_url='loginpage')
@allowed_users(allowed_roles=['admin', 'livraison'])
def createDocument(request):
    forms = documentForm()

     if request.method == 'POST':
        forms = documentForm(request.POST, request.FILES)
        if forms.is_valid():
            forms.save()
            return redirect('/employe')

    context = {'forms':forms}
    return render(request, 'accounts/document_form.html', context)

====Models.py====

class Document(models.Model):
    employe = models.ForeignKey(Employe, null=True, on_delete=models.SET_NULL)
    Number = models.IntegerField(default=1)
    Description = models.CharField(max_length=100, null=True)
    Fichier = models.FileField(upload_to='documents/')
    data_created = models.DateTimeField(auto_now_add=True, null=True)

====Form.py====

class documentForm(ModelForm):
    class Meta:
        model = Document
        fields = '__all__'
        exclude = ['Number']

Вы можете использовать forloop.counter в своем шаблоне для доступа к (1-индексированной) итерации цикла for

{% for d in document %}
  <tr>
    <td>{{ forloop.counter }}</td>
    ...
  </tr>
{% endfor %}

Похоже, что вы можете сделать AutoField в соответствии с Как сделать целочисленное поле с автоматическим увеличением в Django?

Но в качестве запасного варианта: Вы можете просто сделать поле Integer и переопределить метод .save() модельформы и автоматически заполнить его, как self.some_field = Document.objects.all().count()
. ...если вы это сделаете, лучше всего добавить флаг для того, является ли это форма редактирования или нет... Я думаю, что это можно сделать с помощью if self.instance: если true, то это форма редактирования

использовать вызываемую по умолчанию

def get_next_number():
    max_val = Document.objects.aggregate(models.Max('Number'))['Number__max'] or 0
    return max_val + 1


class Document(models.Model):
    Number = models.IntegerField(default=get_next_number)
    ...
Вернуться на верх