Сохранение пользовательских данных c в django - PullRequest
0 голосов
/ 02 марта 2020

В настоящее время я работаю над первым проектом django, в котором уполномоченное лицо может сэкономить свои ежедневные расходы. Я создал страницу входа и регистрации, используя UserCeationForm и AuthenticationForm. Мой код для того же:

  def login_view(request):
    if request.method == 'POST':
        form= AuthenticationForm(data=request.POST)
        if form.is_valid():
            user=form.get_user()
            login(request,user)
            return render (request, 'tasks_notes/index.html')
    else: 
        form= AuthenticationForm()
    return render(request, 'registeration/login.html', {'form':form}) 

  def signup_view(request):
    if request.method == 'POST':
        form= UserCreationForm(request.POST)
        if form.is_valid():
            user=form.save()
            login(request,user)
            return redirect('login')
    else: 
        form=UserCreationForm()
    return render(request, 'tasks_notes/signup.html',{'form':form})

Я создал страницу с именем index.html, где я предоставляю информацию для сохранения своих ежедневных расходов для соответствующего пользователя (вошел в систему) как :

 <form class="col s12" action='{% url "add item" %}' method='post'>
                    {% csrf_token %}
                    <div class="row">
                        <div class="container center">
                            <h3 class='center'>Your total budget is: <span style="color:green;">{{ budget }}</span> dollars</h3>
                            <h3 class='center'>You've spent a total of: <span style="color:red;">{{ expenses }}</span> dollars</h3>
                            <br>
                            <br>
                            <div class="input-field col s3">
                                <input placeholder="Expense name" name="expense_name" id='expense_name' type='text' class='validate'>
                                <label for='expense_name'>Expense name</label>
                            </div>
                            <div class="input-field col s3">
                                <input placeholder='Amount' name='cost' id='cost' type='text' class='validate'>
                                <label for='cost'>Amount</label>
                            </div>
                            <div class="input-field col s3">
                                <input placeholder='Date of Expense' name="expense_date" id="expense_date" type="text" class='datepicker'>
                                <label for="expense_date">Expense Date</label>
                            </div>
                            <button class="btn waves-effect waves-light" type="submit" name="action">Add Expense
                                <i class="material-icons right">add_circle</i>
                            </button>
                        </div>
                    </div>
                </form>

Я пытаюсь взять входные данные и поместить их в views.py файл как:

    def additem_view(request):
    name = request.POST['expense_name']    
    expense_cost = request.POST['cost']  
    expense_date = request.POST['expense_date']
    create=BudgetInfo.objects.create(items=name,cost=expense_cost,date_added=expense_date)
    create.save()
    return HttpResponseRedirect('app')

Мой файл models.py:

from django.db import models
from django.contrib.auth.models import User

class BudgetInfo(models.Model):
    items= models.CharField(max_length=20)
    cost= models.FloatField(blank=False, null=True)
    date_added= models.DateField(auto_now=True)
    user= models.ForeignKey(User, on_delete= models.CASCADE)

Когда я предоставляю данные на моей веб-странице, я получаю сообщение об ошибке, подобное этому:

Exception Type:     IntegrityError
Exception Value:    NOT NULL constraint failed: tasks_notes_budgetinfo.user_id

Я проверил budgetinfo.user_id в моем dbsqlite база данных Я нашел это:

CREATE TABLE IF NOT EXISTS "tasks_notes_budgetinfo" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "items" varchar(20) NOT NULL, "cost" real NULL, "date_added" date NOT NULL, "user_id" integer NOT NULL REFERENCES "auth_user" ("id") DEFERRABLE INITIALLY DEFERRED);

Извините за столь длинное объяснение моего вопроса. Может кто-нибудь сказать мне, где я не прав? Это будет отличная помощь. Спасибо.

Ответы [ 2 ]

0 голосов
/ 02 марта 2020

Ваша BudgetInfo модель имеет ForeignKey, указывающую на вашу User модель. При сохранении BudgetInfo вы никогда не делали ссылку на (ненулевое) пользователя.

Если вы хотите, чтобы скрипт ссылался на «текущего пользователя» (пользователя, который фактически сделал запрос после входа в систему ) вы должны просто использовать request.user:

BudgetInfo.objects.create(
    user=request.user,
    items=name,
    cost=expense_cost,
    date_added=expense_date,
)

Если вы связываете это с «другим пользователем», вам сначала нужно найти этого пользователя, а затем связать его таким же образом:

BudgetInfo.objects.create(
    user=User.objects.get(username="smassey"), # for example
    items=name,
    cost=expense_cost,
    date_added=expense_date,
)
0 голосов
/ 02 марта 2020

попробуйте

 <form class="col s12" action='{% url "add item" %}' method='post'>
                    {% csrf_token %}
                    <input type="text" name="id" value="{{user.id}}">
                </form>

и по вашему мнению

def additem_view(request):
   name = request.POST['expense_name']    
   expense_cost = request.POST['cost']  
   expense_date = request.POST['expense_date']
   id= request.POST['id']

create=BudgetInfo.objects.create(id=id,items=name,cost=expense_cost,date_added=expense_date)
create.save()
return HttpResponseRedirect('app')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...