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, это просто приведет к сбою сохранения и повторной попытке пользователя.