Проверка поля внешнего ключа Django в формах или моделях (получение информации, созданной только этим пользователем, из внешнего ключа) - PullRequest
0 голосов
/ 08 июля 2019

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

views.py

def creatingLessonsForm(request):
    form = CreatingLessonsForm(request.POST or None)
    if form.is_valid():
        post = form.save(commit=False)
        post.CreatedBy = request.user
        post.save()
        form = CreatingLessonsForm()

    context = {'form': form}
    return render(request, 'courses/creatingLessonsForm.html', context)

models.py

class CreatingCourses(models.Model):
    NameOfTheCourses = models.CharField("Name of the courses", max_length=60, blank=False)
    Category = models.ForeignKey(Subject, on_delete=models.CASCADE)
    CreatedBy = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
    Document = models.ForeignKey(Document, on_delete=models.SET_NULL, verbose_name= "Select document for courses introduction",  blank=True , null=True)
    IncludeTest = models.ForeignKey(GenaratedTest, on_delete=models.SET_NULL, verbose_name= "Include test for courses", blank=True , null=True)
    AdditionalInfo = models.TextField("Additional info for courses introduction", max_length=300, blank=False)
    Note = models.TextField("Notes", max_length=180, blank=True)
    Show_the_courses = models.BooleanField(verbose_name= "Show the courses for everyone?",default=True)

    def __str__(self):
        return str(self.NameOfTheCourses) if self.NameOfTheCourses else ''

class CreatingLessons(models.Model):
    Courses = models.ForeignKey(CreatingCourses, on_delete=models.SET_NULL, null=True)
    NameOfTheLesson = models.CharField(max_length=60, verbose_name= "Name of the lesson",  blank=False)
    Document = models.ForeignKey(Document, on_delete=models.SET_NULL, verbose_name= "Document for lesson",  blank=True , null=True)
    CreatedBy = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
    Lesson = models.TextField(max_length=250, verbose_name= "Lesson", blank=False)
    Note = models.TextField("Notes", max_length=100, blank=True)
    Show_the_lesson = models.BooleanField(verbose_name= "Show the lesson inside courses?",default=True)

forms.py

class CreatingCoursesForm(forms.ModelForm):
    class Meta:
        model = CreatingCourses
        fields = ['NameOfTheCourses', 'Category', 'IncludeTest', 'Document'  , 'AdditionalInfo', 'Note', 'Show_the_courses' ]   

class CreatingLessonsForm(forms.ModelForm):
    class Meta:
        model = CreatingLessons
        fields = ['Courses', 'NameOfTheLesson', 'Document', 'Lesson', 'Note', 'Show_the_lesson']    

Изображение веб-страницы:

image

Ответы [ 2 ]

0 голосов
/ 08 июля 2019

Один из вариантов - изменить ваш профиль, чтобы отфильтровать курсы по пользователю.

class CreatingLessonsForm(forms.ModelForm):
    ...

    def __init__(self, *args, **kwargs):
        request_user = kwargs.pop('request_user')

        super().__init__(*args, **kwargs)

        self.fields['Courses'].queryset = self.fields['Courses'].queryset.filter(
            CreatedBy=request_user)

Для того, чтобы это работало, вам нужно будет передать в запросе пользователя запрос, возможно, так:

def creatingLessonsForm(request):
    data = request.POST.copy()
    data['request_user'] = request.user
    form = CreatingLessonsForm(data)
    ...
0 голосов
/ 08 июля 2019

Вам необходимо передать пользователя при инициализации формы, а затем отфильтровать набор запросов для доступных курсов, которые можно выбрать

class CreatingLessonsForm(forms.ModelForm):

    def __init__(self, data=None, user=None, **kwargs):
        super().__init__(data, **kwargs)
        self.fields['Courses'].queryset = CreatingCourses.objects.filter(CreatedBy=user)

А затем при инициализации формы передать пользователю

# When rendering the initial form
form = CreatingLessonsForm(user=request.user)
# When passing POST data to the form
form = CreatingLessonsForm(request.POST, user=request.user)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...