以相同的表单和模板创建,获取和编辑用户信息

时间:2017-04-17 18:09:09

标签: django django-forms django-templates

我正在尝试从用户检索数据。我想要显示用户信息的表单也与我用来更新此信息的表单相同。

UPDATE3

经过一些更新,我完成了这项工作,这是我的代码。如果有人有更好的方法可以分享它:)

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)

感谢您的支持。

2 个答案:

答案 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)