Django通过表单让Site更新TextField值吗?

时间:2017-03-05 13:16:07

标签: python django django-models django-forms html-form

我希望有人可以给我一些关于如何使用Django进行以下操作的帮助(对不起,如果我不解释一切正确,还是Django的新手并且不了解很多东西):

我有一个电影表,这些电影有一个“描述”数据字段,当他们点击它时,表格会打开当前的电影描述。如果他们双击此描述,则允许他们更改它,然后保存该值。我做了一个小GIF来想象这个想法:

enter image description here

至少这就是这背后的基本理念,到目前为止,我已经成功地完成了大部分工作,但遗憾的是不是Django部分,用户的“新”数据被发送到数据库并替换旧的描述的数据。

那么有人可以向我解释我是如何做到这一点的吗?我知道我可能不得不在我的views.py中编写一个函数然后创建一个新的url模式,但我无法弄清楚究竟是怎样的。所以欢迎任何帮助!下面是我的代码(我希望我已经包含了你们需要的每个文件):

views.py

 from django.shortcuts import get_object_or_404, render
 from django.http import HttpResponseRedirect
 from django.urls import reverse
 from django.views import generic
 from django.views.generic.list import ListView
 from .models import *

 class AllMovies(generic.ListView):
     model = Movie
     template_name = "consilium/index.html"
     context_object_name = "latest_movie_list"

 class MovieDetails(generic.DetailView):
     model = Movie
     template_name = "consilium/detail.html"

urls.py

 from django.conf.urls import url
 from . import views
 from .models import *
 from django.views.generic.list import ListView

 app_name = "consilium"
 urlpatterns = [
     url(r'^$', views.AllMovies.as_view(), name="index"),
     url(r'^(?P<slug>[\w_0-9]+)/$', views.MovieDetails.as_view(), name='detail'),
 ]

models.py

 from django.db import models
 from decimal import Decimal
 from django import forms
 from django.contrib import admin

 class Movie(models.Model):
     // removed the other models for better overview
     description = models.TextField('Movie Description')

     def __str__(self):
         return self.title

的index.html

 {% extends "consilium/base.html" %}

 {% block body %}
     <table class="table">
         <thead>
             <tr>
                 <th></th>
                 <th colspan="2">My Movielist</th>
                 <th>
             </tr>
             <tr>
                 <th></th>
                 <th>TITLE</th>
                 <th>GENRE</th>
                 <th>RELEASE DATE</th>
                 <th>DIRECTOR</th>
                 <th>DESCRIPTION</th>
                 <th>RUNTIME</th>
                 <th>STATUS</th>
                 <th>IMDB</th>
             </tr>
         </thead>
         <tbody>
             {% if latest_movie_list %}
                 {% for movie in latest_movie_list %}
                 <tr>
                     <td></td>
                     <td>
                         <a href="{% url 'consilium:detail' movie.slug %}" data-toggle="popover" data-placement="left" data-content='<img class="title-image" src="{{movie.image.url}}"/>'>{{ movie.title }}</a>
                     </td>
                     <td>{{ movie.get_genre_display}}</td>
                     <td>{{ movie.date}}</td>
                     <td>{{ movie.director}}</td>
                     <td id="icn-change" data-toggle="collapse" data-target=".demo{{ forloop.counter }}">
                     Description <i class="fa fa-caret-right"></i>
                     </td>
                     <td>{{ movie.runtime}} min</td>
                     <td>{{ movie.get_status_display}}</td>
                     <td>{{ movie.imdb}}</td>
                 </tr>
                 <tr>
                     <td></td>
                     <td class="hiddenRow" colspan="8">
                         <div class="container collapse demo{{ forloop.counter }}">
                             <div class="row justify-content-center">
                                 <div class="col">
                                     <form method="post" id="usrform">{% csrf_token %}
                                         <textarea id="text" class ="form-control" readonly="true" onkeydown="expandtext(this)" ondblclick="this.readOnly='';">{{movie.description}}</textarea>
                                     </form>
                                 </div>
                             </div>
                             <div class="row justify-content-center">
                                 <div class="col align-self-start">Double Click to Edit</div>
                                 <div class="col align-self-end">
                                     <input type="submit" id="set" class="pull-right"/>
                                 </div>
                             </div>
                         </div>
                     </td>
                 </tr>
                 {% endfor %}
                 {% else %}
                     <tr>
                         <td>No Movies are available.</td>
                     </tr>
             {% endif %}
         </tbody>
     </table>
 {% endblock %}

的script.js

 // removed all other code for overview

 // replace description text with user input
  $('#set').click(function() {
      var test = $('#text').val();
      localStorage.setItem("test", test);
  });

  $('#text').text(localStorage.getItem("test"));

我希望我没有错过任何事情,感谢所有能帮助我的人!

2 个答案:

答案 0 :(得分:1)

我参与了一个类似的项目,这就是我所做的。

from django.forms.models import model_to_dict

@login_required
def edit_profile(request):
    profile, created = ClientProfile.objects.get_or_create(user_id=request.user.id)
    if request.method == 'POST':
        form = ProfileSubmissionForm(request.POST, instance=profile)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect(reverse('jobs:list'))
    else:
        profile_dict = model_to_dict(profile)
        form = ProfileSubmissionForm(profile_dict)
        return render(request, 'jobs/profile.html', {'form': form})

基本上,model_to_dict在表单中呈现存储在数据库中的值。 instance=profile确保我正在更新表单而不是创建新对象。

答案 1 :(得分:0)

感谢pythondev松弛社区的大力帮助!

views.py:获取我的电影模型的描述字段

 class MovieUpdateForm(forms.ModelForm):
     class Meta:
         model = Movie
         fields = ['description']

reverse_lazy非常重要,所以当我点击我的按钮时,它不会将我重定向到consilium(我的appname)/ 2 / update并保留在我拥有我的表的索引站点上

 class MovieUpdateView(UpdateView):
     model = Movie
     form_class = MovieUpdateForm
     success_url = reverse_lazy('consilium:index')

urls.py:

 url(r'^(?P<pk>[0-9]+)/update/$', views.MovieUpdateView.as_view(), name='movie_update'),

这里重要的是把它放在我的urls.py中的slug url模式之前,否则它不起作用:

 url(r'^(?P<slug>[\w_0-9]+)/$', views.MovieDetails.as_view(), name='detail'),

我的html中的表单:使用pk = movie.pk,这样它就会获取正确的电影并给我的textarea命名为“description”,所以我的方法知道数据来自哪里

 <form action="{% url 'consilium:movie_update' pk=movie.pk %}" method="post" id="usrform">{% csrf_token %}
      <textarea id="text" class ="form-control" name="description" readonly="true" onkeydown="expandtext(this)" ondblclick="this.readOnly='';">{{movie.description}}</textarea>
      <input type="submit" id="set" class="pull-right"/>
 </form>