Как наложить ограничения на поле Django в экземплярах, связанных с пользователем
Я делаю приложение для практики, функциональность, которую я хочу достичь, заключается в том, что, когда пользователь создает задачу, только поле времени должно быть уникальным для всех его задач, я сделал (unique=True) в поле времени в модели, но это делает его уникальным по всей базе данных, но я хочу, чтобы он был уникальным только для задач, связанных с пользователем. представление выглядит следующим образом:
@login_required(login_url='login')
def home(request):
tasks = Task.objects.filter(name__username=request.user.username)
form = TaskForm()
if request.method == 'POST':
form = TaskForm(request.POST)
if form.is_valid():
obj = form.save(commit=False)
obj.name = request.user
obj.save()
return redirect('home')
else:
print(request.POST)
print(request.user.username)
messages.warning(request, 'Invalid Data!')
return redirect('home')
context = {'tasks' : tasks}
return render(request, 'task/home.html', context)
модель задачи:
class Task(models.Model):
choices = (
('Completed', 'Completed'),
('In Complete', 'In Complete'),
)
name = models.ForeignKey(User, on_delete=models.CASCADE, blank=True, null=True)
task = models.CharField(max_length=200, null=False, blank=False)
time = models.TimeField(auto_now_add=False, blank=True)
status = models.CharField(max_length=200, choices=choices, null=True, blank=False)
def __str__(self):
return self.task
def get_task_author_profile(self):
return reverse('profile')
Как вы видите, я хочу показать задачу, которую добавил вошедший пользователь.
форма:
class TaskForm(ModelForm):
class Meta:
model = Task
fields = '__all__'
exclude = ['name']
Функциональность, о которой я говорил выше, я пытался достичь с помощью вида:
@login_required(login_url='login')
def home(request):
tasks = Task.objects.filter(name__username=request.user.username)
time = []
for task in tasks:
time.append(task['time'])
form = TaskForm()
if request.method == 'POST':
form = TaskForm(request.POST)
if form.is_valid() and form.cleaned_data['time'] != time:
obj = form.save(commit=False)
obj.name = request.user
obj.save()
return redirect('home')
else:
print(request.POST)
print(request.user.username)
messages.warning(request, 'Invalid Data!')
return redirect('home')
context = {'tasks' : tasks}
return render(request, 'task/home.html', context)
но это дало ошибку: TypeError: 'Task' object is not subscriptable
Я знаю, что это неправильно, но как я могу этого добиться, есть ли в Django что-то, что может обеспечить такую функциональность?
Проблема исходит отсюда:
for task in tasks:
time.append(task['time']) #<--
Здесь, если вы хотите использовать время доступа, вам нужно использовать task.time, потому что task является объектом.
Также нужно исправить еще одну вещь в вашем существующем коде, чтобы заставить его работать, потому что time является списком:
if form.is_valid() and form.cleaned_data['time'] in time:
# ^^^
BTW, не нужно усложнять, вы можете добавить ограничение на уровне базы данных из модели, чтобы сделать время уникальным для конкретного пользователя. Также используйте для этого поле DateTime. Вы можете использовать unique_togather для этого:
class Task(models.Model):
choices = (
('Completed', 'Completed'),
('In Complete', 'In Complete'),
)
name = models.ForeignKey(User, on_delete=models.CASCADE, blank=True, null=True)
task = models.CharField(max_length=200, null=False, blank=False)
time = models.DateTimeField(auto_now_add=False, blank=True)
status = models.CharField(max_length=200, choices=choices, null=True, blank=False)
class Meta:
unique_togather = ['name', 'time']