Django 2.0.3向数据库添加数据

Django 2.0.3向数据库添加数据,django,django-models,django-forms,django-views,Django,Django Models,Django Forms,Django Views,我在django 2.0.3中向数据库添加数据时遇到了一个小问题 我创建了以下模型: from django.contrib.auth.models import User class UserInputSignal(models.Model): name = models.CharField(max_length=512) author = models.ForeignKey(User, on_delete=models.CASCADE) input_file =

我在django 2.0.3中向数据库添加数据时遇到了一个小问题

我创建了以下模型:

from django.contrib.auth.models import User

class UserInputSignal(models.Model):

    name = models.CharField(max_length=512)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    input_file = models.FileField(upload_to='signals/', null=True)
我尝试使用以下表单解决此问题:

from django import forms
from .models import UserInputSignal

class UserInputSignalForm(forms.ModelForm):

    name = forms.CharField()
    input_file = forms.FileField()

    class Meta:
        model = UserInputSignal
        fields = ('name', 'input_file', )
这种观点:

from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from django.contrib.auth import authenticate
from .forms import UserInputSignalForm

@login_required
def storage(request):

form = UserInputSignalForm(request.POST or None)

if request.method == 'POST':
    if form.is_valid():
        name = request.POST.get('name')
        author = request.POST.get(request.user)
        input_file = request.POST.get('input_file')

        return redirect('home')

else:
    form = UserInputSignalForm()

return render(request, 'storage.html', {'form': form})
在我调用的模板中,我创建了如下表单:

  <form method="POST" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Upload</button>
  </form>

{%csrf_令牌%}
{{form.as_p}}
上传

我可以加载带有表单的页面,但它不会将数据发布到数据库中。我想补充一点,我是django的新手,有些机制对我来说很容易理解。我可以请人帮我解决这个问题吗?

在重定向之前,请调用
form.save()
在重定向之前,请调用
form.save()
好的,我已经编写了您的代码,它可以与我一起工作,只需稍作修改:

models.py

class UserInputSignal(models.Model):

name = models.CharField(max_length=512)
author = models.ForeignKey(User, on_delete=models.CASCADE)
input_file = models.FileField(upload_to='signals/', null=True)
objects = models.Manager()

#this returns the name for your modelobject
def __str__(self):
    return self.name
#excluded the assiging as fields defination is enough in itself

class UserInputSignalForm(forms.ModelForm):
    class Meta:
        model = UserInputSignal
        #this will exclude the formfield it self but the author will be saved as the person who is logged in
        exclude = ["author"]
@login_required
def storage(request):
    #authentication for author field using request.user
    insta = UserInputSignal(author=request.user)
    print(request.user)
    form = UserInputSignalForm(request.POST or None, request.FILES or None,instance=insta)
    if request.method == 'POST':        
        if form.is_valid():
            signal = form.save(commit=False)           
            signal.save()

            return redirect('home')
    else:
        form = UserInputSignalForm(instance=insta)
    return render(request,  'storage.html', {'form': form})
from .models import PostModel, UserInputSignal

class UserInputSignalAdmin(admin.ModelAdmin):
     list_display = ('name', 'author', 'input_file' )
admin.site.register(UserInputSignal, UserInputSignalAdmin)
forms.py

class UserInputSignal(models.Model):

name = models.CharField(max_length=512)
author = models.ForeignKey(User, on_delete=models.CASCADE)
input_file = models.FileField(upload_to='signals/', null=True)
objects = models.Manager()

#this returns the name for your modelobject
def __str__(self):
    return self.name
#excluded the assiging as fields defination is enough in itself

class UserInputSignalForm(forms.ModelForm):
    class Meta:
        model = UserInputSignal
        #this will exclude the formfield it self but the author will be saved as the person who is logged in
        exclude = ["author"]
@login_required
def storage(request):
    #authentication for author field using request.user
    insta = UserInputSignal(author=request.user)
    print(request.user)
    form = UserInputSignalForm(request.POST or None, request.FILES or None,instance=insta)
    if request.method == 'POST':        
        if form.is_valid():
            signal = form.save(commit=False)           
            signal.save()

            return redirect('home')
    else:
        form = UserInputSignalForm(instance=insta)
    return render(request,  'storage.html', {'form': form})
from .models import PostModel, UserInputSignal

class UserInputSignalAdmin(admin.ModelAdmin):
     list_display = ('name', 'author', 'input_file' )
admin.site.register(UserInputSignal, UserInputSignalAdmin)
已编辑-Views.py

class UserInputSignal(models.Model):

name = models.CharField(max_length=512)
author = models.ForeignKey(User, on_delete=models.CASCADE)
input_file = models.FileField(upload_to='signals/', null=True)
objects = models.Manager()

#this returns the name for your modelobject
def __str__(self):
    return self.name
#excluded the assiging as fields defination is enough in itself

class UserInputSignalForm(forms.ModelForm):
    class Meta:
        model = UserInputSignal
        #this will exclude the formfield it self but the author will be saved as the person who is logged in
        exclude = ["author"]
@login_required
def storage(request):
    #authentication for author field using request.user
    insta = UserInputSignal(author=request.user)
    print(request.user)
    form = UserInputSignalForm(request.POST or None, request.FILES or None,instance=insta)
    if request.method == 'POST':        
        if form.is_valid():
            signal = form.save(commit=False)           
            signal.save()

            return redirect('home')
    else:
        form = UserInputSignalForm(instance=insta)
    return render(request,  'storage.html', {'form': form})
from .models import PostModel, UserInputSignal

class UserInputSignalAdmin(admin.ModelAdmin):
     list_display = ('name', 'author', 'input_file' )
admin.site.register(UserInputSignal, UserInputSignalAdmin)
JlucasRs告诉您使用
form.save()
是正确的,但您需要将表单分配给某些内容,而不需要在此处使用模型字段,因为
forms.py
会为您这样做

app/url.py
-仅供参考

urlpatterns = [
path('home/', home, name='home'),
path('storage/', storage, name='storage'),
]

编辑-
Admin.py

class UserInputSignal(models.Model):

name = models.CharField(max_length=512)
author = models.ForeignKey(User, on_delete=models.CASCADE)
input_file = models.FileField(upload_to='signals/', null=True)
objects = models.Manager()

#this returns the name for your modelobject
def __str__(self):
    return self.name
#excluded the assiging as fields defination is enough in itself

class UserInputSignalForm(forms.ModelForm):
    class Meta:
        model = UserInputSignal
        #this will exclude the formfield it self but the author will be saved as the person who is logged in
        exclude = ["author"]
@login_required
def storage(request):
    #authentication for author field using request.user
    insta = UserInputSignal(author=request.user)
    print(request.user)
    form = UserInputSignalForm(request.POST or None, request.FILES or None,instance=insta)
    if request.method == 'POST':        
        if form.is_valid():
            signal = form.save(commit=False)           
            signal.save()

            return redirect('home')
    else:
        form = UserInputSignalForm(instance=insta)
    return render(request,  'storage.html', {'form': form})
from .models import PostModel, UserInputSignal

class UserInputSignalAdmin(admin.ModelAdmin):
     list_display = ('name', 'author', 'input_file' )
admin.site.register(UserInputSignal, UserInputSignalAdmin)

Admin.py
中添加此代码,如果它不在那里。

好的,我处理了您的代码,它只需稍加修改即可使用:

models.py

class UserInputSignal(models.Model):

name = models.CharField(max_length=512)
author = models.ForeignKey(User, on_delete=models.CASCADE)
input_file = models.FileField(upload_to='signals/', null=True)
objects = models.Manager()

#this returns the name for your modelobject
def __str__(self):
    return self.name
#excluded the assiging as fields defination is enough in itself

class UserInputSignalForm(forms.ModelForm):
    class Meta:
        model = UserInputSignal
        #this will exclude the formfield it self but the author will be saved as the person who is logged in
        exclude = ["author"]
@login_required
def storage(request):
    #authentication for author field using request.user
    insta = UserInputSignal(author=request.user)
    print(request.user)
    form = UserInputSignalForm(request.POST or None, request.FILES or None,instance=insta)
    if request.method == 'POST':        
        if form.is_valid():
            signal = form.save(commit=False)           
            signal.save()

            return redirect('home')
    else:
        form = UserInputSignalForm(instance=insta)
    return render(request,  'storage.html', {'form': form})
from .models import PostModel, UserInputSignal

class UserInputSignalAdmin(admin.ModelAdmin):
     list_display = ('name', 'author', 'input_file' )
admin.site.register(UserInputSignal, UserInputSignalAdmin)
forms.py

class UserInputSignal(models.Model):

name = models.CharField(max_length=512)
author = models.ForeignKey(User, on_delete=models.CASCADE)
input_file = models.FileField(upload_to='signals/', null=True)
objects = models.Manager()

#this returns the name for your modelobject
def __str__(self):
    return self.name
#excluded the assiging as fields defination is enough in itself

class UserInputSignalForm(forms.ModelForm):
    class Meta:
        model = UserInputSignal
        #this will exclude the formfield it self but the author will be saved as the person who is logged in
        exclude = ["author"]
@login_required
def storage(request):
    #authentication for author field using request.user
    insta = UserInputSignal(author=request.user)
    print(request.user)
    form = UserInputSignalForm(request.POST or None, request.FILES or None,instance=insta)
    if request.method == 'POST':        
        if form.is_valid():
            signal = form.save(commit=False)           
            signal.save()

            return redirect('home')
    else:
        form = UserInputSignalForm(instance=insta)
    return render(request,  'storage.html', {'form': form})
from .models import PostModel, UserInputSignal

class UserInputSignalAdmin(admin.ModelAdmin):
     list_display = ('name', 'author', 'input_file' )
admin.site.register(UserInputSignal, UserInputSignalAdmin)
已编辑-Views.py

class UserInputSignal(models.Model):

name = models.CharField(max_length=512)
author = models.ForeignKey(User, on_delete=models.CASCADE)
input_file = models.FileField(upload_to='signals/', null=True)
objects = models.Manager()

#this returns the name for your modelobject
def __str__(self):
    return self.name
#excluded the assiging as fields defination is enough in itself

class UserInputSignalForm(forms.ModelForm):
    class Meta:
        model = UserInputSignal
        #this will exclude the formfield it self but the author will be saved as the person who is logged in
        exclude = ["author"]
@login_required
def storage(request):
    #authentication for author field using request.user
    insta = UserInputSignal(author=request.user)
    print(request.user)
    form = UserInputSignalForm(request.POST or None, request.FILES or None,instance=insta)
    if request.method == 'POST':        
        if form.is_valid():
            signal = form.save(commit=False)           
            signal.save()

            return redirect('home')
    else:
        form = UserInputSignalForm(instance=insta)
    return render(request,  'storage.html', {'form': form})
from .models import PostModel, UserInputSignal

class UserInputSignalAdmin(admin.ModelAdmin):
     list_display = ('name', 'author', 'input_file' )
admin.site.register(UserInputSignal, UserInputSignalAdmin)
JlucasRs告诉您使用
form.save()
是正确的,但您需要将表单分配给某些内容,而不需要在此处使用模型字段,因为
forms.py
会为您这样做

app/url.py
-仅供参考

urlpatterns = [
path('home/', home, name='home'),
path('storage/', storage, name='storage'),
]

编辑-
Admin.py

class UserInputSignal(models.Model):

name = models.CharField(max_length=512)
author = models.ForeignKey(User, on_delete=models.CASCADE)
input_file = models.FileField(upload_to='signals/', null=True)
objects = models.Manager()

#this returns the name for your modelobject
def __str__(self):
    return self.name
#excluded the assiging as fields defination is enough in itself

class UserInputSignalForm(forms.ModelForm):
    class Meta:
        model = UserInputSignal
        #this will exclude the formfield it self but the author will be saved as the person who is logged in
        exclude = ["author"]
@login_required
def storage(request):
    #authentication for author field using request.user
    insta = UserInputSignal(author=request.user)
    print(request.user)
    form = UserInputSignalForm(request.POST or None, request.FILES or None,instance=insta)
    if request.method == 'POST':        
        if form.is_valid():
            signal = form.save(commit=False)           
            signal.save()

            return redirect('home')
    else:
        form = UserInputSignalForm(instance=insta)
    return render(request,  'storage.html', {'form': form})
from .models import PostModel, UserInputSignal

class UserInputSignalAdmin(admin.ModelAdmin):
     list_display = ('name', 'author', 'input_file' )
admin.site.register(UserInputSignal, UserInputSignalAdmin)

如果没有,请将此代码添加到
Admin.py
中。

很抱歉回答得太晚,但请尝试将
form=UserInputSignalForm()
放在
if request.method='POST
中,然后删除
或None
。这是我唯一认为它会影响它的东西。而且,如果表单由于某种原因无效,在这种情况下它将不会被保存。尝试检查
form.is\u valid()
返回True的内容。Oi Lucas,请在答案本身上添加这种额外的解释,这只是一个简单的问题。很抱歉回答太晚,但是尝试将
form=UserInputSignalForm()
放在
if request.method='POST
中,然后删除
或无
。这是我唯一认为它会影响它的东西。而且,如果表单由于某种原因无效,在这种情况下它将不会被保存。尝试检查
表单的内容。is_valid()
返回True。Oi Lucas,请在答案本身上添加这种额外的解释,这只是一个简单的问题。我目前无法检查这一点,但您建议的解决方案是否支持填写表单时的用户身份验证?我的意思是根据request.user方法或类似的方法从模型中添加author字段?我相信您会先检查此代码并确认其有效,然后我们将继续进行双向身份验证。@MichałKukiełka,我已经根据您的需要更新了代码。请参阅。好的,您建议的添加文件的机制似乎有效,文件将显示在project server上。但是,当我进入数据库的管理面板时,没有与UserInputSignal()模型匹配的表。您是否已在
admin
文件中注册了您的模型?我目前无法检查此问题,但您建议的解决方案是否支持填写表单时的用户身份验证?我的意思是根据request.user方法或类似的方法从模型中添加author字段?我相信您会先检查此代码并确认其有效,然后我们将继续进行双向身份验证。@MichałKukiełka,我已经根据您的需要更新了代码。请参阅。好的,您建议的添加文件的机制似乎有效,文件将显示在project server上。但是,当我进入数据库的管理面板时,没有与UserInputSignal()模型匹配的表。您是否在
admin
文件中注册了模型?