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