Django:在带有TemplateVi的Django表单中添加编辑和删除功能时出现问题

2024-10-01 02:30:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我通过构建一个名为TravelBuddies的应用程序来学习Django。它将允许旅行者计划他们的旅行,并保留相关的旅行项目(如预订、机票、护照复印件、保险信息等),以及为日常活动创建警报。该应用程序还可以更新当地信息,如天气或每日新闻的旅行者。旅行者还可以与某人共享旅行信息,或者让某人与他们合作计划旅行

我创建了一个表单,允许用户添加他们的行程信息,如行程名称、计划员姓名、合作计划员、日期等。但是,我找不到允许他们编辑和删除表单的正确方法。我看过一些视频。但他们不像我一样使用TemplateView。所以,我有点困惑

以下是我在addtrip文件夹下的forms.py文件中的代码:

from django import forms
from django.contrib.auth.models import User
from django.forms import ModelForm
from trips.models import Trip

class TripForm(ModelForm):
    class Meta:
        model = Trip
        fields = ['trip_name', 'date', 'planner_name', 'add_coplanner', 'trip_description']

class UserForm(forms.ModelForm):
    password = forms.CharField(widget=forms.PasswordInput)

    class Meta:
        model = User
        fields = ['username', 'email', 'password']

以下是我在addtrip文件夹下的views.py文件中的代码:

from django.contrib.auth import mixins, authenticate, login
from django.shortcuts import render, redirect
from django.views.generic import TemplateView
from .forms import TripForm, UserForm
from trips.models import Trip
from django.http import HttpResponseRedirect
from django.urls import reverse

# Create your views here.


class AddTripFormView(mixins.LoginRequiredMixin, TemplateView):
    login_url = 'login/'
    template_name = 'addtrip/addtripform.html'

    def get(self, request):
        form = TripForm()
        trips = Trip.objects.all()
        args = {'form': form, 'trips': trips}
        return render(request, self.template_name, args)

    def post(self, request):
        form = TripForm(request.POST)
        if form.is_valid():
            form.save()
            trip_name = form.cleaned_data['trip_name']
            date = form.cleaned_data['date']
            planner_name = form.cleaned_data['planner_name']
            trip_description = form.cleaned_data['trip_description']
            args = {'form': form, 'trip name': trip_name, 'date': date, 'planner name': planner_name, 'trip description': trip_description}
            return HttpResponseRedirect(reverse('trips:triplist'))

class AddUserFormView(TemplateView):
    template_name = 'addtrip/registrationform.html'

    # Display blank form
    def get(self, request):
        form = UserForm()
        args = {'form': form}
        return render(request, self.template_name, args)

    # Process form data
    def post(self, request):
        form = UserForm(request.POST)
        if form.is_valid():
            user = form.save(commit=False)
            username = form.cleaned_data['username']
            password = form.cleaned_data['password']
            user.set_password(password)
            user.save()
            # return user object if credentials are correct
            user = authenticate(username=username, password=password)
            if user is not None:
                if user.is_active:
                    login(request, user)
                    return redirect('addtrip:login')

        return render(request, self.template_name, {'form': form})

以下是我在addtrip文件夹下的urls.py文件中的代码:

from . import views
from django.urls import path
from django.contrib.auth import views as auth_views

app_name = 'addtrip'

urlpatterns = [
    path('addtrip/', views.AddTripFormView.as_view(), name='addtrip'),
    path('register/', views.AddUserFormView.as_view(), name='register'),
    # login
    path('addtrip/login/', auth_views.LoginView.as_view(template_name='addtrip/login.html'), name='login'),
    # logout
    path('logout/', auth_views.LogoutView.as_view(), name='logout'),
]

以下是模板文件夹中addtripform.html文件中的代码:

{% extends 'base.html' %}
{% load static %}

{% block title %} Add Trip {% endblock %}

{% block content %}

<div class="container">
    <h2>Add New Trip</h2>
    <form method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">Submit</button>
    </form>
{% endblock %}

以下是我在trips文件夹中models.py的代码:

from django.contrib.auth.models import User
from django.db import models

class Trip(models.Model):
    trip_name = models.CharField(max_length=100)
    date = models.DateField()
    planner_name = models.CharField(max_length=100)
    add_coplanner = models.ManyToManyField(User)
    trip_description = models.CharField(max_length=1000, default='null')
    slug = models.SlugField(max_length=150, default='null')

    def __str__(self):
        return self.trip_name

    def save(self, *args, **kwargs):
        self.slug = slugify(self.trip_name)
        super().save(*args, **kwargs)


class Activity(models.Model):
    trip = models.ForeignKey(Trip, on_delete=models.CASCADE)
    activity_name = models.CharField(max_length=100)
    date = models.DateField()
    time = models.TimeField()
    location = models.CharField(max_length=100)
    activity_description = models.CharField(max_length=1000, default='null')
    item_type = models.CharField(max_length=100)
    item_number = models.CharField(max_length=100)
    add_cotraveller = models.ManyToManyField(User)
    slug = models.SlugField(max_length=150, default='null')

    def __str__(self):
        return self.activity_name

    def save(self):
        super(Activity, self).save()
        self.slug = '%i-%s' % (
            self.id, slugify(self.trip.trip_name)
        )
        super(Activity, self).save()

以下是我在trips文件夹中urls.py的代码:

from . import views
from django.urls import path

app_name = 'trips'

urlpatterns = [
    path('triplist/', views.TripListView.as_view(), name='triplist'),
    path('triplist/<slug:slug>/', views.ActivityView.as_view(), name='activity'),
    path('tripapi/', views.TripApiView.as_view()),
    path('tripapi/<int:pk>/', views.TripDetailApiView.as_view()),
]

如何在表单中添加编辑和删除功能?是否可以使用def update(self, request):def delete(self, request):这样的函数在TemplateView中添加编辑和删除功能


Tags: pathdjangonamefromimportselfformmodels