我正在尝试从用户检索数据。我想要显示用户信息的表单也与我用来更新此信息的表单相同。
经过一些更新,我完成了这项工作,这是我的代码。如果有人有更好的方法可以分享它:)
models.py
from django.db import models
from django.contrib.auth.models import User
# Create your models here.
class informacionFacturacion(models.Model):
usuario = models.ForeignKey(User, on_delete=models.CASCADE)
apellidos = models.CharField(max_length=100)
nombres = models.CharField(max_length=100)
[More fields...]
def __str__(self):
self.apellidos
forms.py
from .models import informacionFacturacion
#Create your forms here.
class informacionFacturacionForm(ModelForm):
class Meta:
model = informacionFacturacion
fields = [
"usuario",
"apellidos",
"nombres",
[More fields...]
]
views.py
@login_required
def datosPersonales(request):
#Filter query by user ID
query = informacionFacturacion.objects.filter(usuario=request.user)
form = informacionFacturacionForm()
#If query has content, edit record, else, create a new record
if query:
if request.method == "POST":
form = informacionFacturacionForm(request.POST or None, instance=query[0])
if form.is_valid():
edit_content = form.save()
edit_content.save()
else:
if request.method == "POST":
form = informacionFacturacionForm(request.POST)
if form.is_valid():
create_content = form.save(commit=False)
create_content.save()
return HttpResponseRedirect(reverse('datosPersonales'))
context = {
"titulo": "Datos personales | Co.",
"body_class": "class= sidebar_main_open sidebar_main_swipe",
"form": form,
"infoFacturacion": query,
}
template = "micuenta/datosPersonales.html"
return render(request, template, context)
感谢您的支持。
答案 0 :(得分:1)
乍一看,似乎没有填充informacionFacturacion
表。你检查过instance.save()
了吗? (换句话说,表格有效)
其次,在模板中,您希望使用informacionFacturacion
对象作为表单元素,并且您将单独处理它们。做:
if request.POST:
form = informacionFacturacionForm(request.POST)
if form.is_valid():
instance = form.save(commit=False)
instance.save()
else:
# handle here the form error's, maybe report it in the template
else:
query = informacionFacturacion.objects.filter(usuario=request.user)
form = informacionFacturacionForm(instance=query[0])
并呈现form
的{{1}}参数insead:
infoFacturacion
最后,请确保您的模板表单ID与表单元素名称匹配,否则表单将不会被填充。
<强>更新强>
根据您的编辑,现在错误就在这一行:
{{ form.as_p }}
form = informacionFacturacionForm(request.POST, instance=query_id)
是query_id
,它期待一个模型。更改以下行:
int
到
query_id = informacionFacturacion.objects.get(usuario=request.user).id
和错误的一行:
query = informacionFacturacion.objects.get(usuario=request.user)
现在应该可以使用,虽然代码可以简化很多。
编辑2
这是我想你想要的:
form = informacionFacturacionForm(request.POST, instance=query)
答案 1 :(得分:0)
嗯,我的系统遇到同样的问题,所以我做了这个解决方案,也许对你有用! = d
我正在更改提交按钮的值并使用相同的表单:
<button type="submit" id="submitButton" name="button" value="">Save</button>
如果是新任务,我使用JQuery更改按钮的值:
$('#submitButton').val('new');
如果是版本,我会再次更改该值:
$('#submitButton').val('edit');
在我的views.py上,我通过按钮的值检查是编辑还是新保存:
def index(request):
tasks = Task.object.filter()
context = {
'tasks': tasks
}
if request.method == 'POST':
form = NewTask(request.POST or None)
if request.POST['button'] == 'new':
if form.is_valid():
context['is_valid'] = True
form.save()
form = NewTask()
else:
context['is_valid'] = False
if request.POST['button'] == 'edit':
instance = Task.object.filter(pk=request.POST['id']).first()
form = NewTask(request.POST, instance=instance)
if form.is_valid():
context['is_valid'] = True
form.save()
else:
context['is_valid'] = False
else:
form = NewTask()
context['form'] = form
return render(request, 'index.html', context)