首页 > 解决方案 > 如何使用表单更新 Django 模型中的记录?

问题描述

我是 Django 新手,需要一些帮助。

我基本上是在尝试使用 Django 为电影构建一个类似于 Tinder 的应用程序,并研究“滑动”功能的基础知识。而且,在使用表单时,我无法获得滑动输入。我只想要一个来自用户的布尔值(true 表示是,false 表示否),并根据数据库中的电影 id 进行更新。但我无法执行此更新。我的表单添加了一条新记录。

也许更简单的替代方法是从模型中完全删除 swipes 字段,只需将其用作变量并维护一个电影列表,其中该变量被选择为真。在这种情况下,我无法访问电影 ID,所以这也失败了 ;-;

如何以简单有效的方式使其工作?

这是我的 models.py 的样子:

class Movie(models.Model):

    movie_name = models.CharField(max_length=300) # unique id for room
    movie_description = models.TextField(default='')
    movie_genre = models.CharField(max_length=100)
    movie_date_released = models.DateField(null=True)
    movie_swiped = models.BooleanField(default = False)
    
    # Override the __str__ method to return the firstname and lastname
    def __str__(self):
        return self.movie_name

    def is_exists(self):
        ''' Check whether a user exists in the database '''
        if Movie.objects.get(movie_name=self.movie_name): 
            return True
        else:
            return False

视图.py

# Create your views here.

class RoomSwipeView(APIView):

    # Define a class variables 
    serializer_class = MovieSerializer
    queryset = []
    swiped_movies=[]

    def get(self, request):

        # Get the room id from the request
        movie_id = request.GET.get('id')
        
        if movie_id: 
            queryset = Movie.objects.filter(id=movie_id)

        else: 
            queryset = Movie.objects.all()
        
        print(queryset)
        print("BRUHHHH")
        
        form = MovieSwipeForm
        
        return render(request,'swipe.html',{'details':queryset, 'form':form})

    def post(self, request):
        form = MovieSwipeForm(request.POST)
        submitted = False
        if request.method == "POST":
            if form.is_valid():
                print("Getting here!!!!!!!")
                swiped = form.save(commit=False)
                if(swiped.movie_swiped):
                    swiped_movies.push(swiped)
                    print(swiped_movies)
        else:
            form = MovieSwipeForm
            if 'submitted' in request.GET:
                submitted = True

        return render(request,'swipe.html',{'details':queryset, 'form':form,'submitted':submitted})

这个文件中的另一个问题是post 方法没有访问swiped_moviesqueryset类变量,这也会引发错误。

刷卡.html

<html>
    <body>
        <h1> Movie Details</h1>
        {% for obj in details %}
        {{obj.movie_name}}<br/>
        Description: {{obj.movie_description}}<br/>
        Genre: {{obj.movie_genre}}<br/>
        Date Released: {{obj.movie_date_released}}<br/>
        <!-- <button type="button">YES</button>
        <button type="button">NO</button> -->
        {% if submitted %}
            Success
        {% else %}
            <form action="" method="post">
                {% csrf_token %}
                {{ form.as_p }}
                <input type="submit" value="Submit">
                <!-- <input type="submit" value="NO"> -->

            </form>
        {% endif %}
        <br/><br/>       
        {% endfor %}
    </body>
</html>

表格.py

class MovieSwipeForm(ModelForm):
    class Meta:
        model = Movie
        fields = ('movie_swiped',)

标签: pythondjangodatabase

解决方案


您需要在启动表单时将要更新的电影对象实例传递给表单,从而更新存在对象,否则 form.save() 将创建新对象

在视图.py

Instance = Movie.objects.get(id=movie_id)

form = MovieSwipeForm(request.POST, instance=instance)
    

要访问类中的类参数,您需要调用它们 self.parameter 以便在 post 方法中访问 queryset 使用 self.queryset


推荐阅读