Django: Как автогенерировать случайную 6-значную строку

Я хотел бы генерировать уникальный 6-значный код каждый раз, когда пользователь нажимает "генерировать код".

Ошибка AttributeError at /subjects/ Объект 'Manager' не имеет атрибута 'make_random_password'

я добавил шаблоны, модели и представления, используемые для этого. ps. Все еще новичок в django

Views.py

class SubjectView(TemplateView):
template_name='subjects.html'
# context='subjects'
random_number = Subject.objects.make_random_password(length=10, allowed_chars='123456789')
while Subject.objects.filter(attendcode__temp_password=random_number):
         random_number = Subject.objects.make_random_password(length=10, allowed_chars='123456789')


def get_context_data(self, *args, **kwargs):
    context = super().get_context_data(*args, **kwargs)
    context['Attendance code']=Subject.objects.all()
    context['subjects'] =Subject .objects.all()
    context['students']=Student.objects.all()
    context['attendace_code']=Subject.objects.get("attendance_code")
    obj = CourseRegistration.objects.filter(subject_code__gt=0)
    no_students=obj.count()

    # no_students=CourseRegistration.objects.all().count()
    context['no_students']=no_students
    return context

def get_success_url(self):
    print(self.kwargs['slug'])
    return reverse('subject', args=(self.kwargs['slug'],))

Шаблон

{% for subject in subjects %}
                        <tbody class="list" style="text-transform:capitalize;">
                            <tr>
                                <th scope="row">
                                <div class="media align-items-center">
                                    <a href="#" class="avatar rounded-circle mr-3">
                                    {% if subject.thumbnail %}
                                        <img alt="Logo" src="{{subject.thumbnail.url}}">
                                    {% endif %}
                                    </a>
                                    <div class="media-body">
                                    <span class="name mb-0 text-sm">{{subject.subject_name}}</span>
                                    </div>
                                </div>
                                </th>
                                <td class="budget">
                                {{subject.subject_code}}
                                </td>
                                <td>
                                <div class="d-flex align-items-center">
                                    <span class="completion mr-2">{{no_students}}</span>
                                </div>
                                </td>
                                <td>
                                <div class="d-flex align-items-center">
                                    <span class="completion mr-2">{{attendace_code}}</span>
                                </div>
                                </td>
                            </tr>
                        </tbody>
                    {% endfor %}

Models.py

class Subject(models.Model):
    subject_name=models.CharField(max_length=1000,unique=True)
    subject_code=models.CharField(max_length=7,primary_key=True)
    lecturer_ID=models.ForeignKey(Lecturer, related_name="subj1_FK",on_delete=models.PROTECT)
    thumbnail=models.ImageField(blank=True,null=True,upload_to=get_thumbnail)

Нет причин, почему Subject.objects.make_random_password вообще должна быть функцией, если вы не определили ее на объекте Manager, связанном с Subjects.

Кроме того, просматривая ваш код на GitHub, я также не нашел упоминания о поле temp_password.

В любом случае, если у вас есть поле temp_password, которое было установлено unique=True,

import random
import string

# ...
while True:
    password = "".join(random.choice(string.digits) for x in range(10))
    if not Subject.objects.filter(attendcode__temp_password=password).exists():
        break
# ... do something that creates a `Subject` with the given `password`

Поскольку случайное число не генерируется в базе данных, существует мизерная вероятность столкновения двух одновременных запросов, но поскольку поле установлено unique=True, это просто приведет к сбою сохранения и повторной попытке пользователя.

Вернуться на верх