перенаправить автора на его сообщение после его создания и отправки формы с помощью django

#python #python-3.x #django #django-forms #django-views

#python #python-3.x #django #django-forms #django-просмотры

Вопрос:

я хочу перенаправить пользователя на сообщение после его создания с помощью django forms

в models.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

  

в моем view.py

 def text(request, pk):

    form = TextForm()
    
    if request.method == "POST":
        form = TextForm(request.POST)
        if form.is_valid():
            text = form.save()
            text = Text.objects.get(id=pk)
            return redirect('text')

    text = Text.objects.get(id=pk)

    context = {'form': form, 'text': text}

    return render(request, 'main/text.html', context)
  

в моем forms.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'}),

        }
  

в моем urls.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"),
]
 
  

мне пришлось добавить это, чтобы stackoverflow принял мой вопрос, потому что он сказал, что это в основном код, даже после указания всех деталей.

Ответ №1:

Попробуйте это:

 from django.urls import reverse

def text(request, pk):

    form = TextForm()
    
    if request.method == "POST":
        form = TextForm(request.POST)
        if form.is_valid():
            text = form.save()
            return redirect(reverse('text', args=[str(text.id)]))

    text = Text.objects.get(id=pk)

    context = {'form': form, 'text': text}

    return render(request, 'main/text.html', context)
  

Комментарии:

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

2. Мой плохой, пожалуйста, измените текстовую форму (request.POST) на текстовую форму (request.data).

3. он начал сохранять их в базу данных, даже с запросом. СООБЩЕНИЕ, но все еще не перенаправляется, если у вас есть решение, пожалуйста, подключите меня!

Ответ №2:

Есть два способа сделать это. Первое включает в себя настройку функции get_absolute_url() вашей модели. Другой был только что упомянут в другом ответе. В вашем models.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 get_absolute_url(self):
        return "/text/%i/" % self.id
    def __str__(self):
        return self.title

  

В вашем views.py файл:

 def text(request, pk):

    form = TextForm()
    
    if request.method == "POST":
        form = TextForm(request.POST)
        if form.is_valid():
            text = form.save()
            text = Text.objects.get(id=pk)
            return redirect(text)

    text = Text.objects.get(id=pk)

    context = {'form': form, 'text': text}

    return render(request, 'main/text.html', context)
  

Комментарии:

1. это не сработало! он продолжал добавлять данные в базу данных, но не перенаправлял меня на этот пост