You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask-PostgreSQL项目添加用户时遇__init__参数错误求助

Fixing "init() takes 1 positional argument but 3 were given" When Adding Users in Flask-PostgreSQL

Hey Ricardo, let's break down this error you're hitting when trying to add users to your CRUD project. This message almost always pops up when there's a mismatch between how you've set up your User database model's initialization and how you're passing arguments to create a new User instance.

Common Causes & Fixes

1. Incorrect __init__ Method in Your User Model

If you manually defined an __init__ method for your User model but didn't set it up to accept the parameters you're passing, this error will trigger immediately.

Example of the Wrong Approach:

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    password = db.Column(db.String(120), nullable=False)
    
    # This __init__ takes no arguments, but you're passing 2 (username + password)
    def __init__(self):
        pass

Correct Approaches:

Option 1: Let SQLAlchemy Handle Initialization
You don't need to define an __init__ method at all—SQLAlchemy's base Model class already handles accepting keyword arguments for your fields automatically:

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    password = db.Column(db.String(120), nullable=False)
    
    # No __init__ method needed!

Option 2: Define a Custom __init__ That Accepts Parameters
If you want a custom initialization flow, make sure it accepts the arguments you'll pass, or extend the base class's __init__ to keep compatibility:

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    password = db.Column(db.String(120), nullable=False)
    
    def __init__(self, username, password):
        self.username = username
        self.password = password

# Or to retain full SQLAlchemy compatibility:
class User(db.Model):
    # ... your fields ...
    
    def __init__(self, *args, **kwargs):
        super(User, self).__init__(*args, **kwargs)

2. Mismatched Argument Passing in Your Route

Even if your model is set up correctly, you might be passing arguments the wrong way when creating a User instance in your Flask route.

Example of Correct Route Code:

Assuming your add_user.html form has fields named username and password, your route should fetch those values and pass them properly to the User constructor:

from flask import Flask, render_template, request, redirect, url_for

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://user:password@localhost/your_db_name'
db.init_app(app)

@app.route('/add_user', methods=['GET', 'POST'])
def add_user():
    if request.method == 'POST':
        # Fetch form data
        username = request.form.get('username')
        password = request.form.get('password')
        
        # Use keyword arguments (safer, matches SQLAlchemy's default behavior)
        new_user = User(username=username, password=password)
        
        # Or if you used the custom positional __init__:
        # new_user = User(username, password)
        
        db.session.add(new_user)
        db.session.commit()
        return redirect(url_for('user_list'))
    
    return render_template('add_user.html')

3. Verify Your Form's Field Names

Double-check that the name attributes in your add_user.html form match the keys you're using to fetch data in the route. For example:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>Add User</title>
</head>
<body>
    <form method="POST" action="{{ url_for('add_user') }}">
        <label for="username">Username:</label>
        <input type="text" id="username" name="username" required>
        
        <label for="password">Password:</label>
        <input type="password" id="password" name="password" required>
        
        <button type="submit">Add User</button>
    </form>
</body>
</html>

Quick Troubleshooting Checklist

  • Check your User model's __init__ method to ensure it accepts the number of arguments you're passing.
  • Confirm you're passing arguments correctly (positional vs. keyword) when creating a User instance.
  • Verify form field name attributes match the keys you're using in request.form.

内容的提问来源于stack exchange,提问作者Ricardo Pinto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:41:03