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.