- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的应用程序中,我有一个名为产品的页面。在此页面中,我在表格中显示来 self 的数据库的记录。
表格的每一行都有两个按钮,用于添加和编辑特定行中的记录。
添加和编辑将通过我的模型创建的名为 Product 的表单来实现。此表单将以模态显示,当单击添加或编辑按钮时将显示该模态。
我已经实现了添加和编辑功能,在单独的页面上显示一个表单,而不是在模态中。
下面是我的模型:
# models.py
from django.db import models
class Manufacturer(models.Model):
name = models.CharField(max_length=264)
def __str__(self):
return self.name
class Meta:
ordering = ["name"]
class Product(models.Model):
title = models.CharField(max_length=264)
description = models.CharField(max_length=1000, blank=True, null=True)
year_manufactured = models.PositiveIntegerField(blank=True, null=True)
manufacturer = models.ForeignKey(Manufacturer, on_delete=models.CASCADE)
def __str__(self):
return self.title
class Meta:
ordering = ["title"]
这是我的 urls.py:
from django.conf.urls import url
from . import views
app_name = "products"
urlpatterns = [url(r'^products', views.ProductsView.as_view(), name="products"),
url(r"^product/new", views.add_new_product_view, name="add_new_product"),
url(r"^product/(?P<id>[0-9]+)/edit/", views.edit_product_view, name="edit_product")]
以下是我的看法:
from django.views.generic import DetailView, ListView, TemplateView
from django.http import JsonResponse
from django.shortcuts import render, get_object_or_404
from . import models
from products.forms import AddNewProductForm, EditProductForm
def index(request):
return render(request, 'products/products.html')
class ProductsView(ListView):
context_object_name = "products"
model = models.Product
template_name = "products/products.html"
form = AddNewProductForm()
def get_context_data(self, **kwargs):
context = super(ProductsView, self).get_context_data(**kwargs)
context["products"] = models.Product.objects.all().order_by("title")
context["form"] = self.form
return context
def add_new_product_view(request):
if request.method == "POST":
form = AddNewProductForm(request.POST)
if form.is_valid():
form.save(commit=True)
return JsonResponse({'msg': 'Data saved'})
else:
print("ERROR FORM INVALID")
return JsonResponse({'msg': 'ERROR FORM INVALID'})
else:
form = AddNewProductForm()
return JsonResponse({'form': form})
def edit_product_view(request, id):
instance = get_object_or_404(models.Product, id=id)
form = EditProductForm(instance=instance)
if request.method == "POST":
form = EditProductForm(request.POST, instance=instance)
if form.is_valid():
form.save(commit=True)
return JsonResponse({'form': form})
else:
print("ERROR FORM INVALID")
return JsonResponse({'form': form})
我在 products.html 上有这个:
{% extends "products/base.html" %}
{% load static %}
{% block title %}My Products{% endblock %}
{% block content %}
<div class="container" id="my-products-table-container">
<h2 class="text-left caption">Add, view and edit products</h2>
<hr>
<table class="table table-striped table-sm table-bordered" id="my-products-table">
<thead class="thead-inverse">
<tr class="head-row">
<th>Title</th>
<th>Description</th>
<th>Year</th>
<th>Manufacturer</th>
</thead>
<tbody>
{% for product in products %}
<tr class="table-row">
<td>{{ product.title }}</td>
<td>{{ product.description }}</td>
<td>{{ product.year_manufactured }}</td>
<td>{{ product.manufacturer }}</td>
<td><button type="button" class="btn btn-primary" data-toggle="modal" data-target="#addNewProductModalForm">Add New product</button></td>
<td><button onclick="findMyForm({{ product.pk }})">Update product</button></td>
{% endfor %}
</tbody>
</table>
</div>
<!-- Modal Add New Product-->
<div class="modal fade" id="addNewProductModalForm" tabindex="-1" role="dialog" aria-labelledby="addNewProductModalFormLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<form class="form" id="add_new_product_form">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="addNewProductModalFormLabel">Add New Product</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
{% csrf_token %}
{{ form.as_p }}
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" onclick="addNewProduct()">Submit</button>
</div>
</div>
</form>
</div>
</div>
<!-- Modal Edit-->
<div class="modal fade" id="editProductModalForm" tabindex="-1" role="dialog" aria-labelledby="editProductModalFormLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<form class="form" id="edit_product_form" >
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="editProductModalFormLabel">Edit Product</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
{% csrf_token %}
<div id='showForm'></div>
</div>
<div class="modal-footer">
<input type="submit" class="btn btn-primary" value="Submit!">
</div>
</div>
</form>
</div>
</div>
<!-- JS Scripts -->
<script src="{% static "products/js/addProduct.js" %}"></script>
<script>
function findMyForm(productKey) {
$('#editProductModalForm').modal('show');
$.ajax({
type: 'GET',
url: '/product/' + productKey + '/edit/',
success: function(res) {
$("#showForm").html(res);
}
})}
</script>
{% endblock %}
我的 JS 脚本:
#addProduct.js
function addNewProduct(e) {
var addNewProductForm = $("#add_new_product_form");
$.ajax({
type: 'POST',
url: '/product/new/',
data: addNewProductForm.serialize(),
success: function(res){
alert(res['msg'])
}
})
}
我已经更新了我的代码以说明我可以在我的数据库中成功添加一个新产品。此外,我一直致力于从我的数据库中编辑产品。
按下此按钮时:
<button onclick="findMyForm({{ product.pk }})">Update product</button>
出现应该包含编辑表单的模式,然后调用带有 products.pk 参数的 findMyForm 函数。之后,对产品编辑 url 执行 ajax get 请求。
根据我的 urls.py,调用了 edit_product_view
。在这里我遇到了 EditProductForm 不可序列化的错误。
另外,非常感谢 Tico,感谢他一直以来的帮助。
最佳答案
从一开始就很难理解你想要什么。我假设您希望用户看到产品目录,然后,当他单击特定产品的更新按钮时,您需要使用包含该产品正确加载数据的表单来触发模式。
所以我的回答基于这个假设
您的 products_catalog.html 中需要的第一个更改来自:
<a class="btn btn-outline-warning" href="{% url "simple_app:edit_product" product.pk %}"><i class="fa fa-pencil-square-o fa-1x" aria-hidden="true"></i></a>
触发功能的按钮:<button onclick="findMyForm()">Update product</button>
然后您应该将该模式片段添加到 products_catalog.html 的末尾,但启动按钮除外。你不需要那个。同时在模态主体内添加一个空的 div <div id='showForm'></div>
.
现在 findMyForm 函数应该做三件事。启动模态,从服务器获取正确的表单并将表单放在模态主体上。
findMyForm(){
//the name myModal should be ID, as jquery notation suggests.
$('#myModal').modal('show');
$.ajax({
type: 'GET',
url: '/product/'+{{product.pk}}+'/edit/',
success: function(res){
$(#showForm).html(res)
}
})
GET在这里很重要,所以调用进入右边if
的观点。所以这应该叫你的edit_product_view
,根据您的网址设置,它应该返回您想要的形式。表单由 ajax 上的成功回调获取,并放入模态主体中的空 div 中。
但是还有一个大问题。您的 View 正在从头开始再次呈现模板,而您不希望这样。所以诀窍是使用 JsonResponse而不是渲染以避免重新加载(好吧,无论如何它都不会与渲染一起工作)。所以这部分在你看来:
return render(request, 'simple_app/edit_product.html', {'form': form})
应该变成(记得导入from django.http import JsonResponse
):
return JsonResponse({'form': form})
您不再需要 edit_product.html。上述过程在 product_catalog.html 页面的模态内动态构建其内容。
好的。现在您应该能够在产品目录中按下一个按钮,该按钮将弹出一个带有与产品相关的表单的模式,而无需重新加载。假设您进行了更改并想要保存( View 的 POST 部分)。模式类似:
save_form
. {{form.as_p}}
呈现的内容)并对 '/product/'+{{product.pk}}+'/edit/'
进行 ajax POST 调用传递表单数据。编辑:
在模式中添加新产品:
{{form.as_p}}
.在模式页脚中,您应该更改 <input>
到 <button>
标记并将按钮链接到 js 函数 addNew()
.这样做会阻止默认表单提交。addNew是这样的:
addNew(){
var data = {
title: $('#title').val() //Not sure if title is the correct selector.
description: $('#description').val() // get correct id with browser tools.
...
}
// Ajax calls view. Stringify format your js object to a json string.
$.ajax({
type: 'POST',
url: '/product/new/',
data:JSON.stringify(data),
success: function(res){
alert(res['msg'])
}
})
}
数据格式化是棘手的部分。我不确定 django 表单如何期望数据到来。在通过默认验证函数之前,您可能必须在 View 中打印并进行操作。让我知道这对你有何影响。
return index(request)
返回 JsonResponse({'msg':'Data saved'})
以确保您理解它有效。因此您的添加新按钮是默认模式按钮。你按下它,你会打开一个模态,其中包含一个来自你的类 View 的预呈现的空表单。然后你有一个 ok BUTTON 绑定(bind)到一个函数。此函数从您的表单收集数据并通过 Ajax 发送到服务器,您将数据保存到您的模型中。您还可以使用 JsonResponse 从 View (对于其他用例)发回一些内容,这将由成功回调获取。
希望这对您有所帮助!
关于django - 如何从模态内的模型创建和提交表单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46311729/
可不可以命名为MVVM模型?因为View通过查看模型数据。 View 是否应该只与 ViewModelData 交互?我确实在某处读到正确的 MVVM 模型应该在 ViewModel 而不是 Mode
我正在阅读有关设计模式的文章,虽然作者们都认为观察者模式很酷,但在设计方面,每个人都在谈论 MVC。 我有点困惑,MVC 图不是循环的,代码流具有闭合拓扑不是很自然吗?为什么没有人谈论这种模式: mo
我正在开发一个 Sticky Notes 项目并在 WPF 中做 UI,显然将 MVVM 作为我的架构设计选择。我正在重新考虑我的模型、 View 和 View 模型应该是什么。 我有一个名为 Not
不要混淆:How can I convert List to Hashtable in C#? 我有一个模型列表,我想将它们组织成一个哈希表,以枚举作为键,模型列表(具有枚举的值)作为值。 publi
我只是花了一些时间阅读这些术语(我不经常使用它们,因为我们没有任何 MVC 应用程序,我通常只说“模型”),但我觉得根据上下文,这些意味着不同的东西: 实体 这很简单,它是数据库中的一行: 2) In
我想知道你们中是否有人知道一些很好的教程来解释大型应用程序的 MVVM。我发现关于 MVVM 的每个教程都只是基础知识解释(如何实现模型、 View 模型和 View ),但我对在应用程序页面之间传递
我想realm.delete() 我的 Realm 中除了一个模型之外的所有模型。有什么办法可以不列出所有这些吗? 也许是一种遍历 Realm 中当前存在的所有类型的方法? 最佳答案 您可以从您的 R
我正在尝试使用 alias 指令模拟一个 Eloquent 模型,如下所示: $transporter = \Mockery::mock('alias:' . Transporter::class)
我正在使用 stargazer 创建我的 plm 汇总表。 library(plm) library(pglm) data("Unions", package = "pglm") anb1 <- pl
我读了几篇与 ASP.NET 分层架构相关的文章和问题,但是读得太多后我有点困惑。 UI 层是在 ASP.NET MVC 中开发的,对于数据访问,我在项目中使用 EF。 我想通过一个例子来描述我的问题
我收到此消息错误: Inceptionv3.mlmodel: unable to read document 我下载了最新版本的 xcode。 9.4 版测试版 (9Q1004a) 最佳答案 您没有
(同样,一个 MVC 验证问题。我知道,我知道......) 我想使用 AutoMapper ( http://automapper.codeplex.com/ ) 来验证我的创建 View 中不在我
需要澄清一件事,现在我正在处理一个流程,其中我有两个 View 模型,一个依赖于另一个 View 模型,为了处理这件事,我尝试在我的基本 Activity 中注入(inject)两个 View 模型,
如果 WPF MVVM 应该没有代码,为什么在使用 ICommand 时,是否需要在 Window.xaml.cs 代码中实例化 DataContext 属性?我已经并排观看并关注了 YouTube
当我第一次听说 ASP.NET MVC 时,我认为这意味着应用程序由三个部分组成:模型、 View 和 Controller 。 然后我读到 NerdDinner并学习了存储库和 View 模型的方法
Platform : ubuntu 16.04 Python version: 3.5.2 mmdnn version : 0.2.5 Source framework with version :
我正在学习本教程:https://www.raywenderlich.com/160728/object-oriented-programming-swift ...并尝试对代码进行一些个人调整,看看
我正试图围绕 AngularJS。我很喜欢它,但一个核心概念似乎在逃避我——模型在哪里? 例如,如果我有一个显示多个交易列表的应用程序。一个列表向服务器查询匹配某些条件的分页事务集,另一个列表使用不同
我在为某个应用程序找出最佳方法时遇到了麻烦。我不太习惯取代旧 TLA(三层架构)的新架构,所以这就是我的来源。 在为我的应用程序(POCO 类,对吧??)设计模型和 DAL 时,我有以下疑问: 我的模
我有两个模型:Person 和 Department。每个人可以在一个部门工作。部门可以由多人管理。我不确定如何在 Django 模型中构建这种关系。 这是我不成功的尝试之一 [models.py]:
我是一名优秀的程序员,十分优秀!