2017-03-05 80 views
1

我希望有人可以给我一些帮助,告诉我如何用Django做以下事情(如果我没有解释一切正确,对Django还是个新东西,并且不知道很多事情,请谅解):Django让用户通过表单更新网站上的TextField值?

我有一个电影表,那些电影有一个“描述”数据字段,当他们点击它时,一个表格打开并显示电影的当前描述。如果他们双击这个描述,他们可以改变它,然后保存该值。我做了一个小的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")); 

我希望我没有错过任何东西,感谢大家谁可以帮我!

+1

未来您正在试图*更新*现有的Movie实例。在文档中查看[UpdateView](https://docs.djangoproject.com/en/1.10/ref/class-based-views/generic-editing/#updateview)。 –

+0

谢谢,会给它一个读:) –

回答

0

感谢pythondev slack社区的大力帮助!

views.py:让我的电影模式

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

reverse_lazy的描述字段是很重要的,所以,当我点击我的按钮,它不会重定向我康士廉(我的应用程序的名字)/ 2 /更新并保留在我有我的表的索引网站上

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

网址。潘岳:

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

在这里,这是我塞URL模式我在我的urls.py之前把这个重要的,否则它不工作:

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

我在我的HTML表单:使用PK = movie.pk所以会抢了正确的电影,给我的textarea的名字“说明”,所以我的方法知道其中数据是从

<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> 
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确保我正在更新表单而不是创建新对象。

+0

嘿,首先谢谢你!你能解释一下我的代码更详细吗?我对整个Python/Django主题还不熟悉,但是我还没有完全了解:)我试着用你的代码来模拟我的模型,但是它并没有工作,即使控制台也没有给出任何回应错误消息。也不会我必须添加一些东西到我的urls.py并更改我的JavaScript文件? –

+0

'def edit_description(request): description,created = Movie.objects.get_or_create(movie_id = request.movi​​e.id) if request.method =='POST': form = usrform(request.POST,instance = description ) 如果form.is_valid(): form.save() 返回HttpResponseRedirect(反向( 'CONSILIUM:索引')) 否则: profile_dict = model_to_dict(介绍) 形式= usrform(profile_dict) 返回渲染(请求,'consilium/index.html',{'form':form})' 试图理解你给我一点代码,是否正确使用? –

相关问题