Ассоциировать пользователя с постом 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
модель раздел документации .