Ассоциировать пользователя с постом Django и MySQL

Я пытаюсь связать пользователя с постом. У меня есть две модели students для пользователей и sublists для постов пользователей с внешним ключом (автор). Я использую базу данных MySQL и использую формы для хранения данных в них. Когда моя форма.author выполняет в моем HTML файле, она дает мне список идентификаторов для всех пользователей в базе данных, но я уже вошел в систему и хочу написать пост как вошедший пользователь без выбора. Если удалить, то он говорит, что моя форма не действительна, что имеет смысл, так как я не ввожу form.author. Так как я использую MySQL, я не использую встроенный метод аутентификации пользователя, а вместо этого сравниваю email и пароль с вводом формы входа. Трачу на это слишком много времени, но с этим трудно обойтись. Любая помощь будет оценена

мой views.py выглядит следующим образом

def addnew(request):
if request.method == 'POST':
    form = Sublist(request.POST)
    if form.is_valid():
        try:
            form.save()
            messages.success(request, ' Subscirption Saved')
            name = sublist.objects.get(name=name)
            return render (request, 'subscrap/main.html', {'sublist': name})
        except:
            pass
    else:
        messages.success(request, 'Error')
        pass
else:
    form = Sublist()
return render(request, 'subscrap/addnew.html', {'form': form})


@login_required(login_url='login')
@cache_control(no_cache=True, must_revalidate=True, no_store=True) 
def main(request):
    return render(request, 'subscrap/main.html')
    


def mod(request):
    student = students.objects.all()
    return render(request, 'subscrap/mod.html' , {'students': student})

My Models.py

class students(models.Model):
    fname = models.CharField(max_length=50)
    lname = models.CharField(max_length=50)
    password = models.CharField(max_length = 50 , null = True)
    passwordrepeat = models.CharField(max_length = 50, null = True)
    email = models.EmailField(max_length=150)
    class Meta:
        db_table = "students"

class sublist(models.Model):
    author = models.ForeignKey(students, related_name='sublist' ,on_delete=models.CASCADE)
    name = models.CharField(max_length=150)
    cost = models.IntegerField(default = 0)
    renewalcycle = models.IntegerField(default = 0)
    class Meta:
        db_table = "sublist"

Поскольку я использую формы, вот мой forms.py

lass StudentForm(forms.ModelForm):
    class Meta:
        model = students
        fields = "__all__"

class Studentlogin(forms.Form):
    email = forms.EmailField(max_length=150)
    password = forms.CharField(max_length = 50, widget=forms.PasswordInput)
    
class Sublist(forms.ModelForm):
    class Meta:
        model = sublist
        fields = "__all__"

Исключите Author из Sublist формы:

class Sublist(forms.ModelForm):
    class Meta:
        model = sublist
        exclude = ['author']

В методе addnew вы связываете .instance.author с request.user:

@login_required(login_url='login')
def addnew(request):
    if request.method == 'POST':
        form = Sublist(request.POST)
        if form.is_valid():
            form.instance.author = request.user
            form.save()
            messages.success(request, ' Subscirption Saved')
            return redirect('some_view')
        else:
            messages.error(request, 'Error')
    else:
        form = Sublist()
    return render(request, 'subscrap/addnew.html', {'form': form})

Примечание: Модели в Django пишутся в PascalCase, а не snake_case, поэтому вы можете переименовать модель из sublist в Sublist.


Примечание: Обычно Form или ModelForm заканчивается суффиксом …Form, чтобы избежать коллизии с именем модели, и чтобы было ясно, что мы работаем с формой. Поэтому, возможно, лучше использовать SublistForm вместо Sublist.


Примечание: Обычно лучше использовать settings.AUTH_USER_MODEL [Django-doc] для ссылки на модель пользователя, чем использовать students непосредственно. Для получения дополнительной информации вы можете посмотреть ссылку на User модель раздел документации .

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