je veux rediriger l'utilisateur vers le message après l'avoir créé avec les formulaires django
dans models.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.home, name='home'),
path('text/<str:pk>', views.text, name="text"),
path('signin/', views.signin, name="signin"),
path('signup/', views.signup, name="signup"),
path('logout/', views.logout, name="logout"),
]
dans ma vue.py
class TextForm(ModelForm):
class Meta:
model = Text
fields = ['title','document','requirements','deadline']
widgets = {
'title' : forms.TextInput(attrs={'placeholder':'Title','class':'form-control m-2 mb-4 pb-2'}),
'deadline' : forms.DateInput(attrs={'placeholder':'Deadline','type':'date','class':'form-control m-2 pt-2',
'id':'opendate'}),
'requirements' : forms.Textarea(attrs={'placeholder':ps_note,'class':'form-control col m-2','rows':'3'}),
'document' : forms.Textarea(attrs={'placeholder':ps_text,'class':'form-control'}),
}
dans mes forms.py
if request.method == "POST":
form = TextForm(request.POST)
if form.is_valid() and request.user.is_authenticated:
user = request.user
text = form.save(commit=False)
author = User.objects.filter(email=user.email).first()
text.author = author
form.save()
form = TextForm()
context = {'form': form, 'text': text}
return render(request, 'main/text.html', context)
dans mes urls.py
class Text(models.Model):
title = models.CharField(max_length=200, null=True)
document = models.TextField(max_length=None, null=True)
requirements = models.TextField(max_length=200, null=True)
date_created = models.DateField(auto_now_add=True, null=True)
deadline = models.DateField(null=True)
author = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
def __str__(self):
return self.title
J'ai dû ajouter cela, donc stackoverflow accepte ma question car il dit que c'est principalement du code même après avoir dit tous les détails que je pense
4 Réponses :
Ne devriez-vous pas changer "nom" en "pk" dans votre urls.py?
je ne pense pas, cela fonctionne bien lorsque j'essaie de saisir chaque message, mon problème est avec la redirection vers le message qui a été créé
je pense que vous devez utiliser "commit"
form.save(commit=True)
vérifier cette réponse
J'ai essayé de lire le code mais je n'ai pas pu l'appliquer moi-même, pouvez-vous me montrer exactement ce qu'il faut ajouter ou ici pour ajouter (commit = True)
def text(request, pk):
form = TextForm()
if request.method == "POST":
form = TextForm(request.POST)
if form.is_valid():
text = form.save(commit=False)
text = Text.objects.get(id=pk)
text.save()
return redirect('text')
else:
text = Text.objects.get(id=pk)
context = {'form': form, 'text': text}
return render(request, 'main/text.html', context)
si quelqu'un cherche quelque chose de similaire,
après quelques jours, j'ai pu le résoudre moi-même voici ce que j'ai fait:
if request.method == "POST":
text_form = TextForm(request.POST)
if text_form.is_valid() and request.user.is_authenticated:
user = request.user
text = text_form.save(commit=False)
author = User.objects.filter(email=user.email).first()
text.author = author
text_form.save()
text_form = TextForm()
# this to select the id of the model object
pk = text.id
return redirect("text",pk)
Pouvez-vous ajouter les urls.py?
@ArakkalAbu je l'ai ajouté
IMHO, mieux vaut diviser la vue de liste et la vue détaillée.